Internet of Things (IoT) has been rapidly growing in the past few years in all life disciplines. IoT provides automation and smart control to its users in different domains such as home automation, healthcare systems, automotive, and many more. Given the tremendous number of connected IoT devices, this growth leads to enormous automatic interactions among sizeable IoT apps in their environment, making IoT apps more intelligent and more enjoyable to their users. But some unforeseen interactions of IoT apps and any potential malicious behaviour can seriously cause insecure and unsafe consequences to its users, primarily non-experts, who lack the required knowledge regarding the potential impact of their IoT automation processes. In this paper, we study the problem of security and safety verification of IoT systems. We survey techniques that utilize program analysis to verify IoT applications' security and safety properties. The study proposes a set of categorization and classification attributes to enhance our understanding of the research landscape in this domain. Moreover, we discuss the main challenges considered in the surveyed work and potential solutions that could be adopted to ensure the security and safety of IoT systems.