cpp/DFAchecks.cpp (212 lines of code) (raw):

// // Created by AK on 30/10/16. // //========================================================== // Local DFA //========================================================== enum class Color { Red, Blue, Green, Yellow }; void do_shadow_color(int shadow) { Color cl1, cl2; if (shadow) cl1 = Color::Red, cl2 = Color::Blue; else cl1 = Color::Green, cl2 = Color::Yellow; if (cl1 == Color::Red || cl2 == Color::Yellow) { } } //========================================================== void Sample2(int flag) { Color c; switch (flag) { case 0: c = Color::Red; break; case 1: c = Color::Blue; break; default: c = Color::Green; } switch (c) { case Color::Red: break; case Color::Blue: break; case Color::Green: break; case Color::Yellow: break; } } //========================================================== enum class States { Started, Stopped, Waiting }; void Sample3(States current) { current = States::Started; if (current == States::Stopped) { //... } //... } //========================================================== enum CollisionType { None, Left, Right, Top, Bottom }; class Ball { public: int getSpeedX() { return 0; } int getSpeedY() { return 0; } }; bool Sample4(Ball& ball, CollisionType type) { int mulX = 1, mulY = 1; switch (type) { case Left: if (ball.getSpeedX() < 0) mulX = -1; break; case Right: if (ball.getSpeedX() > 0) mulX = -1; break; case Top: if (ball.getSpeedY() < 0) mulY = -1; break; case Bottom: if (ball.getSpeedY() > 0) mulY = -1; break; } if (mulX == -1 && mulY == -1) { //do smth:... return true; } else { return false; } } int check() { while(true) {} return 0; } //========================================================== //Loop conditions void test_loop() { for (int i = 0; i < 10;) { if (i > 5) break; } { int x = 10; while (x > 0) { int &ref = {x}; --ref; } } { int x = 10; int *p = &x; ([p, x]() { while (x > 0) *p = 0; })(); } } //========================================================== //Dangling pointer struct node { int data; struct node *next; }; class linked_list { private: node *head,*tail; public: linked_list() { head = nullptr; tail = nullptr; } void process(); void add_node(int n); }; void linked_list::add_node(int n) { node *tmp = new node; tmp->data = n; tmp->next = nullptr; if(head == nullptr) { head = tmp; tail = tmp; } else { tail->next = tmp; tail = tail->next; } } void linked_list::process() { for (node *pt = head; pt != nullptr; pt = pt->next) { delete pt; } } //========================================================== // Global DFA //========================================================== // Unused value void use(int n) {;} class UseVal { int field; void operate() { field = 1001; } void doOperation() { use(field); operate(); } public: void callOperation() { doOperation(); } }; //========================================================== //Null dereferencing class Deref { int* foo() { return nullptr; } public: void bar() { int* buffer = foo(); buffer[0] = 0; } }; //========================================================== // Unreachable call sites bool always_false() { return false; } static void myOperation() {} void handleCondOperation() { if (always_false()) myOperation(); } //========================================================== // Dangling pointer static void delete_ptr(int* ptr) { delete ptr; } int handle_pointer() { int* int_ptr = new int; delete_ptr(int_ptr); *int_ptr = 1; return 0; } //========================================================== // Unreachable code enum State { Processing, Idle, Stop }; void log_msg(const char *message) {} State nextState; static void setState(State state) { nextState = state; } static void Consume(State state) { switch (state) { case Processing: log_msg("Processing"); break; case Idle: log_msg("Idle"); break; case Stop: log_msg("Stop!"); break; } } void Process() { Consume(Processing); Consume(Idle); } //========================================================== // Array index out of bounds #include <array> void aioob() { int buffer[100]; for (int i = 0; i <= 100; i++) buffer[i] = 0; // buffer overflow when i is equal to 100 std::array<int, 3> a = {1, 2, 3}; a[a.size()] = 4; // a overflow when index is equal to a.size() } //==========================================================