Annotate ColoredPrintf with the format attribute and fix bugs.
googletest doesn't currently build with clang's very aggressive -Wformat-nonliteral warning. It requires that all non-literal format strings come from the argument of a function annotated with a compatible format attribute. Fixing that reports that ColoredPrintf's callers weren't passing the normal -Wformat warning. Some messages were passed directly into the format string rather than via "%s".
This commit is contained in:
		
							parent
							
								
									17a1f78f86
								
							
						
					
					
						commit
						6d9c745ca4
					
				@ -874,6 +874,23 @@ using ::std::tuple_size;
 | 
			
		||||
# define GTEST_ATTRIBUTE_UNUSED_
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// Use this annotation before a function that takes a printf format string.
 | 
			
		||||
#if defined(__GNUC__) && !defined(COMPILER_ICC)
 | 
			
		||||
# if defined(__MINGW_PRINTF_FORMAT)
 | 
			
		||||
// MinGW has two different printf implementations. Ensure the format macro
 | 
			
		||||
// matches the selected implementation. See
 | 
			
		||||
// https://sourceforge.net/p/mingw-w64/wiki2/gnu%20printf/.
 | 
			
		||||
#  define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
 | 
			
		||||
       __attribute__((__format__(__MINGW_PRINTF_FORMAT, string_index, \
 | 
			
		||||
                                 first_to_check)))
 | 
			
		||||
# else
 | 
			
		||||
#  define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check) \
 | 
			
		||||
       __attribute__((__format__(__printf__, string_index, first_to_check)))
 | 
			
		||||
# endif
 | 
			
		||||
#else
 | 
			
		||||
# define GTEST_ATTRIBUTE_PRINTF_(string_index, first_to_check)
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
// A macro to disallow operator=
 | 
			
		||||
// This should be used in the private: declarations for a class.
 | 
			
		||||
#define GTEST_DISALLOW_ASSIGN_(type)\
 | 
			
		||||
 | 
			
		||||
@ -2953,6 +2953,7 @@ bool ShouldUseColor(bool stdout_is_tty) {
 | 
			
		||||
// cannot simply emit special characters and have the terminal change colors.
 | 
			
		||||
// This routine must actually emit the characters rather than return a string
 | 
			
		||||
// that would be colored when printed, as can be done on Linux.
 | 
			
		||||
GTEST_ATTRIBUTE_PRINTF_(2, 3)
 | 
			
		||||
void ColoredPrintf(GTestColor color, const char* fmt, ...) {
 | 
			
		||||
  va_list args;
 | 
			
		||||
  va_start(args, fmt);
 | 
			
		||||
@ -4729,7 +4730,7 @@ bool ShouldShard(const char* total_shards_env,
 | 
			
		||||
      << "Invalid environment variables: you have "
 | 
			
		||||
      << kTestShardIndex << " = " << shard_index
 | 
			
		||||
      << ", but have left " << kTestTotalShards << " unset.\n";
 | 
			
		||||
    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
 | 
			
		||||
    ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
    exit(EXIT_FAILURE);
 | 
			
		||||
  } else if (total_shards != -1 && shard_index == -1) {
 | 
			
		||||
@ -4737,7 +4738,7 @@ bool ShouldShard(const char* total_shards_env,
 | 
			
		||||
      << "Invalid environment variables: you have "
 | 
			
		||||
      << kTestTotalShards << " = " << total_shards
 | 
			
		||||
      << ", but have left " << kTestShardIndex << " unset.\n";
 | 
			
		||||
    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
 | 
			
		||||
    ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
    exit(EXIT_FAILURE);
 | 
			
		||||
  } else if (shard_index < 0 || shard_index >= total_shards) {
 | 
			
		||||
@ -4746,7 +4747,7 @@ bool ShouldShard(const char* total_shards_env,
 | 
			
		||||
      << kTestShardIndex << " < " << kTestTotalShards
 | 
			
		||||
      << ", but you have " << kTestShardIndex << "=" << shard_index
 | 
			
		||||
      << ", " << kTestTotalShards << "=" << total_shards << ".\n";
 | 
			
		||||
    ColoredPrintf(COLOR_RED, msg.GetString().c_str());
 | 
			
		||||
    ColoredPrintf(COLOR_RED, "%s", msg.GetString().c_str());
 | 
			
		||||
    fflush(stdout);
 | 
			
		||||
    exit(EXIT_FAILURE);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user