blob: f9f9f014bbf34f990ac27febcfef3b1616a67653 [file] [log] [blame]
/* APPLE LOCAL file radar 5195402 */
/* Test for correct implementation of format_arg attribute on CFStringRef type of
format strings. */
/* { dg-options "-Wformat -Wformat-security -Wformat-nonliteral -Wunused-function -mmacosx-version-min=10.5" } */
/* { dg-do compile { target powerpc*-*-darwin* i?86*-*-darwin* } } */
#include <Cocoa/Cocoa.h>
APPKIT_EXTERN NSInteger My_NSRunAlertPanel(NSString *title, CFStringRef msgFormat, NSString *defaultButton, NSString *alternateButton, NSString *otherButton, ...)
__attribute__ ((format (__CFString__, 2, 6)));
extern CFStringRef _My_LocalizedStringForKey( CFStringRef key, NSString *value, NSString *tableName )
__attribute__ ((format_arg (1)));
#define My_NSLocalizedString(key, comment) \
_My_LocalizedStringForKey(key,@"",nil)
static void Buggy_WarnAboutResponse( CFStringRef serverResponse ) /* { dg-warning "unused function 'Buggy_WarnAboutResponse'" } */
{
/* This next line is a security problem: it passes an untrusted string, received from the network,
as the format string of NSRunAlertPanel. At least six such misuses of NSRunAlertPanel were
identified and exploited in both Apple and third-party apps, during the Month Of Apple Bugs.
Fortunately, the format attribute added to My_NSRunAlertPanel causes the compiler to emit
a warning for this unsafe call. */
My_NSRunAlertPanel(@"Bad Server Response:", serverResponse, @"OK",nil,nil); /* { dg-warning "format string is not a string literal" } */
}
static void SimpleAlert() /* { dg-warning "unused function 'SimpleAlert'" } */
{
/* My_NSRunAlertPanel this time uses My_NSLocalizedString callfor its formatting argument.
because of format_arg (1) attribute on My_NSLocalizedString, no warning to be issued.
Even when -Wformat-nonliteral is specified. */
My_NSRunAlertPanel(@"Title of oops panel",
My_NSLocalizedString(CFSTR("Something went wrong. Sorry."), @"Message of oops panel"),
@"OK",nil,nil);
}