Jon
Jon

Reputation: 1489

Prevent Xcode/clang from raising logic error on intentionally flawed code

For testing purposes only, I'm including a function to intentionally crash my app (testing my app's handling of unintentional crashes). To do so, I'm using:

strcpy(0, "crash");

Of course, when doing analysis of my code, Xcode reports the logic error Null pointer argument in call to string copy function. I've tried wrapping the offending code like so:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wnonnull"
    strcpy(0, "crash");
#pragma clang diagnostic pop

But Xcode (v9.2 (9C40b)) still complains (this isn't a warning, it's a logic error, I understand). Is there some other way to keep Xcode/clang from flagging this code? Is there some better way to induce a crash that can be protected from Xcode/clang analysis error?

Upvotes: 4

Views: 194

Answers (3)

jscs
jscs

Reputation: 64002

It seems to me that the best way to defeat static analysis is to do something dynamic. Objective-C, by its very nature, has lots of options for that, since the compiler can't guarantee a 1-to-1 correspondence between a message send and a method.

The simplest thing to do is probably to trigger an indexing error:

[@"" characterAtIndex:0]; // or
[@[] objectAtIndex:0];

Even if the analyzer knew that the default implementations of those methods raised an exception for out-of-bounds access, it can't know that you haven't swapped them out at runtime for an implementation that handles the problem gracefully.

Upvotes: 0

Jon
Jon

Reputation: 1489

This worked for me (no need to wrap in warning suppressions). It passes Xcode/clang's analysis and still results in the crash I want:

char *x = (char *)@"0".integerValue; strcpy(x, "crash");

Upvotes: 2

UKMonkey
UKMonkey

Reputation: 6983

How about volatile char* x=0; strcpy(x, "crash")

This'll work because the compiler isn't allowed to assume that x when read will be any value; meaning any checks that it might have hard coded should be ignored.

Upvotes: 0

Related Questions