// Check that the more specific checkers report and not the generic // StdCLibraryFunctionArgs checker. // RUN: %clang_analyze_cc1 %s \ // RUN: -analyzer-checker=core \ // RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \ // RUN: -analyzer-config apiModeling.StdCLibraryFunctions:ModelPOSIX=true \ // RUN: -analyzer-checker=alpha.unix.StdCLibraryFunctionArgs \ // RUN: -analyzer-checker=alpha.unix.Stream \ // RUN: -triple x86_64-unknown-linux-gnu \ // RUN: -verify // Make sure that all used functions have their summary loaded. // RUN: %clang_analyze_cc1 %s \ // RUN: -analyzer-checker=core \ // RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \ // RUN: -analyzer-config apiModeling.StdCLibraryFunctions:ModelPOSIX=true \ // RUN: -analyzer-checker=alpha.unix.StdCLibraryFunctionArgs \ // RUN: -analyzer-checker=alpha.unix.Stream \ // RUN: -analyzer-config apiModeling.StdCLibraryFunctions:DisplayLoadedSummaries=true \ // RUN: -triple x86_64-unknown-linux 2>&1 | FileCheck %s // CHECK: Loaded summary for: int isalnum(int) // CHECK: Loaded summary for: unsigned long fread(void *restrict, size_t, size_t, FILE *restrict) __attribute__((nonnull(1))) // CHECK: Loaded summary for: int fileno(FILE *stream) void initializeSummaryMap(); // We analyze this function first, and the call expression inside initializes // the summary map. This way we force the loading of the summaries. The // summaries would not be loaded without this because during the first bug // report in WeakDependency::checkPreCall we stop further evaluation. And // StdLibraryFunctionsChecker lazily initializes its summary map from its // checkPreCall. void analyzeThisFirst() { initializeSummaryMap(); } typedef __typeof(sizeof(int)) size_t; struct FILE; typedef struct FILE FILE; int isalnum(int); size_t fread(void *restrict, size_t, size_t, FILE *restrict) __attribute__((nonnull(1))); int fileno(FILE *stream); void test_uninit_arg() { int v; int r = isalnum(v); // \ // expected-warning{{1st function call argument is an uninitialized value [core.CallAndMessage]}} (void)r; } void test_notnull_arg(FILE *F) { int *p = 0; fread(p, sizeof(int), 5, F); // \ expected-warning{{Null pointer passed to 1st parameter expecting 'nonnull' [core.NonNullParamChecker]}} } void test_notnull_stream_arg() { fileno(0); // \ // expected-warning{{Stream pointer might be NULL [alpha.unix.Stream]}} }