Computing-in-memory (CIM) has been considered as one of the promising solutions to overcome von Neumann bottleneck in the presence of data-intensive applications. Although various CIM architectures with CMOS-based and/or emerging memory devices have been proposed, the device and circuit non-idealities introduce reliability issues and cause inaccurate or even wrong computing results. In this tutorial, we attempt to introduce the source of unreliability, show the detection methods, and discuss reliability-aware CIM designs from both hardware and software perspectives for mitigating the reliability issues.