【问题标题】:Invalid type in argument to printf format specifier and extra argument to printf format specifierprintf 格式说明符的参数类型和 printf 格式说明符的额外参数类型无效
【发布时间】:2020-10-07 14:28:13
【问题描述】:

我一直在 Coverity 中调试此 RTOS 代码,但遇到了一些小错误。这些错误是不言自明的,因为它们是格式说明符错误。这两个错误都在主要功能上。第一个错误就行了:

RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);

错误:printf 格式说明符 (PRINTF_ARGS) 的参数类型无效 invalid_type:格式说明符 %X 的参数结果应为 unsigned int 类型,但类型为 unsigned long。

第二个错误就行了:

RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);

错误:printf 格式说明符的额外参数 (PRINTF_ARGS) extra_argument:格式字符串未使用此参数:status。

我不确定我如何传递一个额外的参数,因为 RTOS_TEST 确实需要一个参数。请告诉我我做错了什么。

#if !defined(__arc__)
   #define RTOS_TEST(...) printf(__VA_ARGS__)
#else
   #define RTOS_TEST(...)
#endif

typedef uint_32  _mqx_uint, _PTR_ _mqx_uint_ptr;
typedef uint32_t Status_t;

void SECTION_CODE("CODE_SLOW") WrappersTest(uint_32  parameter)
{
   _lwmem_pool_id lwmem_pool_id;
   pointer        error_ptr;
   pointer        error2_ptr;
   Status_t       status;
   _mqx_uint      result;
   BOOL           fail = FALSE;

   RTOS_TEST("Start MQX integrity tests ...\n");

   TestQueue();
   TestLightWeightSemaphore();
   TestMutexAPI();
   TestLightWeightEvent();
   TestFastMessageQueue();
   TestLightWeightMemory();

#if defined(MQX_TEST_EVENT_TEST)
   RTOS_TEST("Calling _event_test ..."); fflush(stdout);
   result = _event_test(&error_ptr);

   if (result != MQX_OK)
   {
      RTOS_TEST(" ***FAILED*** _event_test: 0x%08X\n", result);
      fail = TRUE;
   }
   else
   {
      RTOS_TEST("PASSED!\n");
   }
#endif // MQX_TEST_EVENT_TEST

status = RTOS_MutexInit(&testMutex, (uint8_t*)Name);

if (status != STATUS_OK)
{
   RTOS_TEST("MQX init mutex FAILED: 0x%08X\n", status);
}

for (; loopCount > 0; loopCount--)
{
   status = RTOS_MutexLock(&testMutex);

   if (status != STATUS_OK)
   {
      RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
   }
}

int main()
{
   .........,
   RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);
   ..........
   if (status != STATUS_OK)
         {
            RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
         }
   ..........
   return 0;
}

【问题讨论】:

  • 第二个格式字符串缺少%。第一行的错误似乎不言自明:您的参数类型错误。
  • @AdrianMole 我应该在第一个中使用 %u 还是 0x%08X
  • 0x%08lX 用于无符号长整数。 (注意添加的是小写 L)。
  • @AdrianMole 但 0x%08lX 不是无符号长整数。它要求一个无符号整数。另外,如果我写大写 L 会有什么区别?

标签: c operating-system printf rtos format-specifiers


【解决方案1】:

"MQX lock mutex FAILED: 0x08X\n", status 只是缺少"%" 以及@Vlad from Moscow 的回答。
很好,OP 启用了许多警告/错误。


关于类型不匹配,使用匹配的打印说明符。

例如:statusuint32_t,使用 "%" PRIX32

#include <inttypes.h>

typedef uint32_t Status_t;
Status_t       status;

// RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
RTOS_TEST("MQX lock mutex FAILED: 0x%08" PRIX32 "\n", status);

【讨论】:

    【解决方案2】:

    在本次通话中

    RTOS_TEST("MQX lock mutex FAILED: 0x08X\n", status);
    

    您至少忘记在格式说明符'X' 之前指定符号'%' 例如"0x%08X"。所以编译器会发出一个错误,指的是参数status 存在冗余参数

    在本次通话中

    RTOS_TEST(" Error = 0x%X, pool = 0x%X\n", result, (_mqx_uint)error_ptr);
    

    你必须指定长度修饰符'l'

    例如

    RTOS_TEST(" Error = %#lX, pool = %#lX\n", result, (_mqx_uint)error_ptr);
    

    注意不用写0x。相反,您可以使用标志'#'。如果您想要前缀 '0x',请使用小写格式说明符 'x' like"%#lx". Otherwise use the upper case format specifier'X'like"%#lX"`。

    【讨论】:

      猜你喜欢
      • 2020-05-23
      • 2016-05-29
      • 2012-05-17
      • 2012-05-17
      • 1970-01-01
      • 2017-08-04
      • 2017-11-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多