// RUN: %clang --analyze %s -Xclang -analyzer-ipa=inlining -fblocks -o %t // RUN: FileCheck -input-file %t %s // void mmm(int y) { if (y != 0) y++; } int foo(int x, int y) { mmm(y); if (x != 0) x++; return 5/x; } // Test a bug triggering only when inlined. void has_bug(int *p) { *p = 0xDEADBEEF; } void test_has_bug() { has_bug(0); } void triggers_bug(int *p) { *p = 0xDEADBEEF; } // This function triggers a bug by calling triggers_bug(). The diagnostics // should show when p is assumed to be null. void bar(int *p) { if (!!p) return; if (p == 0) triggers_bug(p); } // ========================================================================== // // Test inlining of blocks. // ========================================================================== // void test_block__capture_null() { int *p = 0; ^(){ *p = 1; }(); } void test_block_ret() { int *p = ^(){ int *q = 0; return q; }(); *p = 1; } void test_block_blockvar() { __block int *p; ^(){ p = 0; }(); *p = 1; } void test_block_arg() { int *p; ^(int **q){ *q = 0; }(&p); *p = 1; } // CHECK: // CHECK: // CHECK: // CHECK: files // CHECK: // CHECK: // CHECK: diagnostics // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line11 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line11 // CHECK: col7 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line12 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line12 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col6 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line12 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line12 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line12 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col14 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Assuming 'x' is equal to 0 // CHECK: message // CHECK: Assuming 'x' is equal to 0 // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line12 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: line12 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line14 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line14 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line14 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line14 // CHECK: col10 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line14 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: line14 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line14 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line14 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: line14 // CHECK: col14 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Division by zero // CHECK: message // CHECK: Division by zero // CHECK: // CHECK: // CHECK: descriptionDivision by zero // CHECK: categoryLogic error // CHECK: typeDivision by zero // CHECK: issue_context_kindfunction // CHECK: issue_contextfoo // CHECK: issue_hash4 // CHECK: location // CHECK: // CHECK: line14 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line23 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line23 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Calling 'has_bug' // CHECK: message // CHECK: Calling 'has_bug' // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line18 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: depth1 // CHECK: extended_message // CHECK: Entered call from 'test_has_bug' // CHECK: message // CHECK: Entered call from 'test_has_bug' // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line18 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: line18 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line19 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line19 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line19 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line19 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line19 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth1 // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: issue_context_kindfunction // CHECK: issue_contexthas_bug // CHECK: issue_hash1 // CHECK: location // CHECK: // CHECK: line19 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line33 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line33 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line33 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: line33 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line33 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line33 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: line33 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Assuming 'p' is null // CHECK: message // CHECK: Assuming 'p' is null // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line33 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: line33 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line36 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line36 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line36 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line36 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line37 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line37 // CHECK: col16 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line37 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line37 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: line37 // CHECK: col19 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Calling 'triggers_bug' // CHECK: message // CHECK: Calling 'triggers_bug' // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line26 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: depth1 // CHECK: extended_message // CHECK: Entered call from 'bar' // CHECK: message // CHECK: Entered call from 'bar' // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line26 // CHECK: col1 // CHECK: file0 // CHECK: // CHECK: // CHECK: line26 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line27 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line27 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line27 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line27 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line27 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth1 // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: issue_context_kindfunction // CHECK: issue_contexttriggers_bug // CHECK: issue_hash1 // CHECK: location // CHECK: // CHECK: line27 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line45 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line45 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line45 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: message // CHECK: Variable 'p' initialized to a null pointer value // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line45 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line45 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line46 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line46 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line46 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line46 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line46 // CHECK: col18 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Calling anonymous block // CHECK: message // CHECK: Calling anonymous block // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line46 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: depth1 // CHECK: extended_message // CHECK: Entered call from 'test_block__capture_null' // CHECK: message // CHECK: Entered call from 'test_block__capture_null' // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line46 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line46 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line46 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: line46 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line46 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line46 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: line46 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth1 // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: location // CHECK: // CHECK: line46 // CHECK: col8 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line50 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line50 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line50 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: line50 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line50 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: line50 // CHECK: col12 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line51 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line51 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line51 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line51 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line51 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: issue_context_kindfunction // CHECK: issue_contexttest_block_ret // CHECK: issue_hash2 // CHECK: location // CHECK: // CHECK: line51 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line55 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line55 // CHECK: col9 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line56 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line56 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line56 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line56 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line57 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line57 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line57 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line57 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line57 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: issue_context_kindfunction // CHECK: issue_contexttest_block_blockvar // CHECK: issue_hash3 // CHECK: location // CHECK: // CHECK: line57 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: path // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line61 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line61 // CHECK: col5 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line62 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line62 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindcontrol // CHECK: edges // CHECK: // CHECK: // CHECK: start // CHECK: // CHECK: // CHECK: line62 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line62 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: end // CHECK: // CHECK: // CHECK: line63 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: line63 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: kindevent // CHECK: location // CHECK: // CHECK: line63 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: ranges // CHECK: // CHECK: // CHECK: // CHECK: line63 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: line63 // CHECK: col4 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: depth0 // CHECK: extended_message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: message // CHECK: Dereference of null pointer (loaded from variable 'p') // CHECK: // CHECK: // CHECK: descriptionDereference of null pointer (loaded from variable 'p') // CHECK: categoryLogic error // CHECK: typeDereference of null pointer // CHECK: issue_context_kindfunction // CHECK: issue_contexttest_block_arg // CHECK: issue_hash3 // CHECK: location // CHECK: // CHECK: line63 // CHECK: col3 // CHECK: file0 // CHECK: // CHECK: // CHECK: // CHECK: // CHECK: