63 lines · c
1// RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \2// RUN: -analyzer-checker=core \3// RUN: -analyzer-checker=apiModeling.Errno \4// RUN: -analyzer-checker=debug.ExprInspection \5// RUN: -analyzer-checker=debug.ErrnoTest \6// RUN: -analyzer-checker=unix.Errno \7// RUN: -DERRNO_VAR8 9// RUN: %clang_analyze_cc1 -verify -analyzer-output text %s \10// RUN: -analyzer-checker=core \11// RUN: -analyzer-checker=apiModeling.Errno \12// RUN: -analyzer-checker=debug.ExprInspection \13// RUN: -analyzer-checker=debug.ErrnoTest \14// RUN: -analyzer-checker=unix.Errno \15// RUN: -DERRNO_FUNC16 17#include "Inputs/errno_var.h"18#include "Inputs/system-header-simulator.h"19#ifdef ERRNO_VAR20#include "Inputs/errno_var.h"21#endif22#ifdef ERRNO_FUNC23#include "Inputs/errno_func.h"24#endif25 26int ErrnoTesterChecker_setErrnoCheckState();27 28void something();29 30void testErrnoCheckUndefRead() {31 int X = ErrnoTesterChecker_setErrnoCheckState();32 something();33 X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function succeeds but sets 'errno' to an unspecified value}}34 if (X == 0) { // expected-note{{'X' is equal to 0}}35 // expected-note@-1{{Taking true branch}}36 if (errno) {37 } // expected-warning@-1{{An undefined value may be read from 'errno'}}38 // expected-note@-2{{An undefined value may be read from 'errno'}}39 }40}41 42void testErrnoCheckOverwrite() {43 int X = ErrnoTesterChecker_setErrnoCheckState();44 something();45 X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function returns 2. 'errno' should be checked to test for failure}}46 if (X == 2) { // expected-note{{'X' is equal to 2}}47 // expected-note@-1{{Taking true branch}}48 errno = 0; // expected-warning{{Value of 'errno' was not checked and is overwritten here}}49 // expected-note@-1{{Value of 'errno' was not checked and is overwritten here}}50 }51}52 53void testErrnoCheckOverwriteStdCall() {54 int X = ErrnoTesterChecker_setErrnoCheckState();55 something();56 X = ErrnoTesterChecker_setErrnoCheckState(); // expected-note{{Assuming that this function returns 2. 'errno' should be checked to test for failure}}57 if (X == 2) { // expected-note{{'X' is equal to 2}}58 // expected-note@-1{{Taking true branch}}59 printf(""); // expected-warning{{Value of 'errno' was not checked and may be overwritten by function 'printf'}}60 // expected-note@-1{{Value of 'errno' was not checked and may be overwritten by function 'printf'}}61 }62}63