// Check the case when only the StreamChecker is enabled. // RUN: %clang_analyze_cc1 %s \ // RUN: -analyzer-checker=core,alpha.unix.Stream \ // RUN: -analyzer-checker=debug.ExprInspection \ // RUN: -analyzer-config eagerly-assume=false \ // RUN: -triple x86_64-unknown-linux \ // RUN: -verify=stream // Check the case when only the StdLibraryFunctionsChecker is enabled. // RUN: %clang_analyze_cc1 %s \ // RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \ // RUN: -analyzer-config apiModeling.StdCLibraryFunctions:DisplayLoadedSummaries=true \ // RUN: -analyzer-checker=debug.ExprInspection \ // RUN: -analyzer-config eagerly-assume=false \ // RUN: -triple x86_64-unknown-linux \ // RUN: -verify=stdLib 2>&1 | FileCheck %s // Check the case when both the StreamChecker and the // StdLibraryFunctionsChecker are enabled. // RUN: %clang_analyze_cc1 %s \ // RUN: -analyzer-checker=core,alpha.unix.Stream \ // RUN: -analyzer-checker=apiModeling.StdCLibraryFunctions \ // RUN: -analyzer-config apiModeling.StdCLibraryFunctions:DisplayLoadedSummaries=true \ // RUN: -analyzer-checker=debug.ExprInspection \ // RUN: -analyzer-config eagerly-assume=false \ // RUN: -triple x86_64-unknown-linux \ // RUN: -verify=both 2>&1 | FileCheck %s // Verify that the summaries are loaded when the StdLibraryFunctionsChecker is // enabled. // CHECK: Loaded summary for: int getchar() // CHECK-NEXT: Loaded summary for: unsigned long fread(void *restrict, size_t, size_t, FILE *restrict) // CHECK-NEXT: Loaded summary for: unsigned long fwrite(const void *restrict, size_t, size_t, FILE *restrict) #include "Inputs/system-header-simulator.h" void clang_analyzer_eval(int); void test_fread_fwrite(FILE *fp, int *buf) { fp = fopen("foo", "r"); if (!fp) return; size_t x = fwrite(buf, sizeof(int), 10, fp); clang_analyzer_eval(x <= 10); // \ // stream-warning{{TRUE}} \ // stdLib-warning{{TRUE}} \ // both-warning{{TRUE}} \ clang_analyzer_eval(x == 10); // \ // stream-warning{{TRUE}} \ // stream-warning{{FALSE}} \ // stdLib-warning{{UNKNOWN}} \ // both-warning{{TRUE}} \ // both-warning{{FALSE}} fclose(fp); }