Skip to content
Snippets Groups Projects
Commit ec216ad1 authored by Anna Zaks's avatar Anna Zaks
Browse files

[static analyzer] Analyzer is skipping forward declared C/C++ functions

A patch by Karthik Bhat!

This patch fixes a regression introduced by r224398. Prior to r224398
we were able to analyze the following code in test-include.c and report
a null deref in this case. But post r224398 this analysis is being skipped.

E.g.
  // test-include.c
  #include "test-include.h"
  void test(int * data) {
    data = 0;
    *data = 1;
  }

   // test-include.h
  void test(int * data);

This patch uses the function body (instead of its declaration) as the location
of the function when deciding if the Decl should be analyzed with path-sensitive
analysis. (Prior to r224398, the call graph was guaranteed to have a definition
when available.)

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@240800 91177308-0d34-0410-b5e6-96231b3b80d8
parent e9bb2d18
No related branches found
No related tags found
No related merge requests found
......@@ -588,7 +588,10 @@ AnalysisConsumer::getModeForDecl(Decl *D, AnalysisMode Mode) {
// - Header files: run non-path-sensitive checks only.
// - System headers: don't run any checks.
SourceManager &SM = Ctx->getSourceManager();
SourceLocation SL = SM.getExpansionLoc(D->getLocation());
SourceLocation SL = D->hasBody() ? D->getBody()->getLocStart()
: D->getLocation();
SL = SM.getExpansionLoc(SL);
if (!Opts->AnalyzeAll && !SM.isWrittenInMainFile(SL)) {
if (SL.isInvalid() || SM.isInSystemHeader(SL))
return AM_None;
......
// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s
#include "test-include-cpp.h"
int TestIncludeClass::test1(int *p) {
p = 0;
return *p; // expected-warning{{Dereference of null pointer}}
}
int TestIncludeClass::test2(int *p) {
p = 0;
return *p; // expected-warning{{Dereference of null pointer}}
}
#ifndef TEST_INCLUDE_CPP_H
#define TEST_INCLUDE_CPP_H
class TestIncludeClass {
int test1(int *);
static int test2(int *);
};
#endif
// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s
#include "test-include.h"
#define DIVYX(X,Y) Y/X
void test_01(int *data) {
data = 0;
*data = 1; // expected-warning{{Dereference of null pointer}}
}
int test_02() {
int res = DIVXY(1,0); // expected-warning{{Division by zero}}
// expected-warning@-1{{division by zero is undefined}}
return res;
}
int test_03() {
int res = DIVYX(0,1); // expected-warning{{Division by zero}}
// expected-warning@-1{{division by zero is undefined}}
return res;
}
\ No newline at end of file
void test_01(int * data);
#define DIVXY(X,Y) X/Y
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment