Enable type-checking of arguments passed to printf() et al.
authorSandrine Bailleux <sandrine.bailleux@arm.com>
Thu, 5 Feb 2015 15:42:31 +0000 (15:42 +0000)
committerSandrine Bailleux <sandrine.bailleux@arm.com>
Fri, 6 Mar 2015 13:07:43 +0000 (13:07 +0000)
This patch modifies the declarations of the functions printf() et al.
and adds the right GCC attribute to request the compiler to check
the type of the arguments passed to these functions against the given
format string. This will ensure that the compiler outputs warning
messages like the following whenever it detects an inconsistency:

 file.c:42: warning: format ‘%d’ expects type ‘int’, but argument 3 has type ‘long int’

It also fixes the type mismatch inconsistencies that it revealed
across the code base.

NOTE: THIS PATCH MAY FORCE PLATFORM PORTS OR SP/SPDS THAT USE THE
PRINTF FAMILY OF FUNCTIONS TO FIX ANY TYPE MISMATCH INCONSISTENCIES.

Change-Id: If36bb54ec7d6dd2cb4791d89b02a24ac13fd2df6

bl31/runtime_svc.c
bl32/tsp/tsp_main.c
include/common/debug.h
include/stdlib/stdio.h
plat/juno/bl1_plat_setup.c

index c33748f99da4cbad7c5a5a23e36c9331c8dcdeb0..fd64c82497a477a2b348f4e13e3a30abde698757 100644 (file)
@@ -103,8 +103,8 @@ void runtime_svc_init(void)
                 */
                rc = validate_rt_svc_desc(&rt_svc_descs[index]);
                if (rc) {
-                       ERROR("Invalid runtime service descriptor 0x%x (%s)\n",
-                                       &rt_svc_descs[index],
+                       ERROR("Invalid runtime service descriptor 0x%lx (%s)\n",
+                                       (uintptr_t) &rt_svc_descs[index],
                                        rt_svc_descs[index].name);
                        goto error;
                }
index c6000e19ecc3e9e7f59441225d1b0437999836bf..d8895b2f9539ebb04bb22ce34a90f154f6ea99e3 100644 (file)
@@ -109,9 +109,9 @@ uint64_t tsp_main(void)
 {
        NOTICE("TSP: %s\n", version_string);
        NOTICE("TSP: %s\n", build_message);
-       INFO("TSP: Total memory base : 0x%x\n", (unsigned long)BL32_TOTAL_BASE);
-       INFO("TSP: Total memory size : 0x%x bytes\n",
-                        (unsigned long)(BL32_TOTAL_LIMIT - BL32_TOTAL_BASE));
+       INFO("TSP: Total memory base : 0x%lx\n", BL32_TOTAL_BASE);
+       INFO("TSP: Total memory size : 0x%lx bytes\n",
+                        BL32_TOTAL_LIMIT - BL32_TOTAL_BASE);
 
        uint64_t mpidr = read_mpidr();
        uint32_t linear_id = platform_get_core_pos(mpidr);
@@ -129,7 +129,7 @@ uint64_t tsp_main(void)
 
 #if LOG_LEVEL >= LOG_LEVEL_INFO
        spin_lock(&console_lock);
-       INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu on requests\n", mpidr,
+       INFO("TSP: cpu 0x%lx: %d smcs, %d erets %d cpu on requests\n", mpidr,
             tsp_stats[linear_id].smc_count,
             tsp_stats[linear_id].eret_count,
             tsp_stats[linear_id].cpu_on_count);
@@ -158,8 +158,8 @@ tsp_args_t *tsp_cpu_on_main(void)
 
 #if LOG_LEVEL >= LOG_LEVEL_INFO
        spin_lock(&console_lock);
-       INFO("TSP: cpu 0x%x turned on\n", mpidr);
-       INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu on requests\n", mpidr,
+       INFO("TSP: cpu 0x%lx turned on\n", mpidr);
+       INFO("TSP: cpu 0x%lx: %d smcs, %d erets %d cpu on requests\n", mpidr,
                tsp_stats[linear_id].smc_count,
                tsp_stats[linear_id].eret_count,
                tsp_stats[linear_id].cpu_on_count);
@@ -199,8 +199,8 @@ tsp_args_t *tsp_cpu_off_main(uint64_t arg0,
 
 #if LOG_LEVEL >= LOG_LEVEL_INFO
        spin_lock(&console_lock);
-       INFO("TSP: cpu 0x%x off request\n", mpidr);
-       INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu off requests\n", mpidr,
+       INFO("TSP: cpu 0x%lx off request\n", mpidr);
+       INFO("TSP: cpu 0x%lx: %d smcs, %d erets %d cpu off requests\n", mpidr,
                tsp_stats[linear_id].smc_count,
                tsp_stats[linear_id].eret_count,
                tsp_stats[linear_id].cpu_off_count);
@@ -242,7 +242,7 @@ tsp_args_t *tsp_cpu_suspend_main(uint64_t arg0,
 
 #if LOG_LEVEL >= LOG_LEVEL_INFO
        spin_lock(&console_lock);
-       INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu suspend requests\n",
+       INFO("TSP: cpu 0x%lx: %d smcs, %d erets %d cpu suspend requests\n",
                mpidr,
                tsp_stats[linear_id].smc_count,
                tsp_stats[linear_id].eret_count,
@@ -281,9 +281,9 @@ tsp_args_t *tsp_cpu_resume_main(uint64_t suspend_level,
 
 #if LOG_LEVEL >= LOG_LEVEL_INFO
        spin_lock(&console_lock);
-       INFO("TSP: cpu 0x%x resumed. suspend level %d\n",
+       INFO("TSP: cpu 0x%lx resumed. suspend level %ld\n",
                mpidr, suspend_level);
-       INFO("TSP: cpu 0x%x: %d smcs, %d erets %d cpu suspend requests\n",
+       INFO("TSP: cpu 0x%lx: %d smcs, %d erets %d cpu suspend requests\n",
                mpidr,
                tsp_stats[linear_id].smc_count,
                tsp_stats[linear_id].eret_count,
@@ -316,8 +316,8 @@ tsp_args_t *tsp_system_off_main(uint64_t arg0,
 
 #if LOG_LEVEL >= LOG_LEVEL_INFO
        spin_lock(&console_lock);
-       INFO("TSP: cpu 0x%x SYSTEM_OFF request\n", mpidr);
-       INFO("TSP: cpu 0x%x: %d smcs, %d erets requests\n", mpidr,
+       INFO("TSP: cpu 0x%lx SYSTEM_OFF request\n", mpidr);
+       INFO("TSP: cpu 0x%lx: %d smcs, %d erets requests\n", mpidr,
             tsp_stats[linear_id].smc_count,
             tsp_stats[linear_id].eret_count);
        spin_unlock(&console_lock);
@@ -349,8 +349,8 @@ tsp_args_t *tsp_system_reset_main(uint64_t arg0,
 
 #if LOG_LEVEL >= LOG_LEVEL_INFO
        spin_lock(&console_lock);
-       INFO("TSP: cpu 0x%x SYSTEM_RESET request\n", mpidr);
-       INFO("TSP: cpu 0x%x: %d smcs, %d erets requests\n", mpidr,
+       INFO("TSP: cpu 0x%lx SYSTEM_RESET request\n", mpidr);
+       INFO("TSP: cpu 0x%lx: %d smcs, %d erets requests\n", mpidr,
             tsp_stats[linear_id].smc_count,
             tsp_stats[linear_id].eret_count);
        spin_unlock(&console_lock);
@@ -384,10 +384,10 @@ tsp_args_t *tsp_smc_handler(uint64_t func,
        tsp_stats[linear_id].smc_count++;
        tsp_stats[linear_id].eret_count++;
 
-       INFO("TSP: cpu 0x%x received %s smc 0x%x\n", read_mpidr(),
+       INFO("TSP: cpu 0x%lx received %s smc 0x%lx\n", mpidr,
                ((func >> 31) & 1) == 1 ? "fast" : "standard",
                func);
-       INFO("TSP: cpu 0x%x: %d smcs, %d erets\n", mpidr,
+       INFO("TSP: cpu 0x%lx: %d smcs, %d erets\n", mpidr,
                tsp_stats[linear_id].smc_count,
                tsp_stats[linear_id].eret_count);
 
index a8dcb8da353aafc742df2a298918e6aaa1170926..d198c321bd4eecc93ce791ce3dad3cde8f6f19ee 100644 (file)
@@ -84,6 +84,6 @@
 void __dead2 do_panic(void);
 #define panic()        do_panic()
 
-void tf_printf(const char *fmt, ...);
+void tf_printf(const char *fmt, ...) __printflike(1, 2);
 
 #endif /* __DEBUG_H__ */
index 60e081b43329070d46de996654ee2be96cdf6b42..57e5c7fa424c99a26f5fcc8cb0253d6e1a5ba0ab 100644 (file)
@@ -58,12 +58,13 @@ typedef     __ssize_t       ssize_t;
 
 #define        EOF     (-1)
 
-int     printf(const char * __restrict, ...);
+int     printf(const char * __restrict, ...) __printflike(1, 2);
 int     putchar(int);
 int     puts(const char *);
-int     sprintf(char * __restrict, const char * __restrict, ...);
+int     sprintf(char * __restrict, const char * __restrict, ...)
+       __printflike(2, 3);
 int     vsprintf(char * __restrict, const char * __restrict,
-          __va_list);
+          __va_list) __printflike(2, 0);
 
 int     sscanf(const char *__restrict, char const *__restrict, ...);
 
index 23e8592be5a2449b1a4c84b9eff13c0941cde02c..2aeaba618ac074c6a422628488ccb06f88763b7d 100644 (file)
@@ -99,7 +99,7 @@ void bl1_early_platform_setup(void)
                    BL1_RAM_BASE,
                    bl1_size);
 
-       INFO("BL1: 0x%lx - 0x%lx [size = %u]\n", BL1_RAM_BASE, BL1_RAM_LIMIT,
+       INFO("BL1: 0x%lx - 0x%lx [size = %lu]\n", BL1_RAM_BASE, BL1_RAM_LIMIT,
             bl1_size);
 }