为什么会这样的想法? printf使我的代码工作

时间:2017-05-26 14:27:00

标签: c printf bluetooth-lowenergy

我有下一个代码,基本上它的作用是读取按钮状态,如果按下它,那么BLE包的制造商数据就是说B,相反,当没有按下按钮时数据是A.

while (true) {

    printf("\r\n");

    if ((int)nrf_gpio_pin_read(PIN_IN)) {

            //Setting up the advertising data with scan response data = Null
            err_code = sd_ble_gap_adv_data_set(Conectado, Conectado_length,
                    0, 0);
            APP_ERROR_CHECK(err_code);

    } else {
            //Setting up the advertising data with scan response data = Null

            err_code = sd_ble_gap_adv_data_set(Prueba,
                    Conectado_length, 0, 0);
            APP_ERROR_CHECK(err_code);
    }

    power_manage();
}

如果我对printf行进行评论,那么这个谜语就会出现,正如你所看到的那样,对变量没有任何作用,那么即使按下按钮很长时间,制造商数据也不会改变。我已经尝试更改printf延迟,不起作用,只要我正在执行指令,读取此行前后的状态无关紧要。

出于功耗原因,我无法使用uart模块。

提前感谢您的帮助

1 个答案:

答案 0 :(得分:2)

您有未定义的行为,如评论中所述。如上所述,它可能是我们看不到的东西,或者它可能是第一行:

printf("\r\n");

编辑:我认为重要的是要指出,正如@dbush在评论中所提到的,使用非常量参数时会产生危险(风险)。这些有问题,因为它开启了格式字符串可以以开发人员不想要的方式改变的可能性。由于此示例使用文字字符串参数,因此该危险不存在。

您正在使用printf打印字符串,而不使用格式说明符,例如%s。这至少是有风险的。 ..

  

因为printf是一个varargs函数,所以它使用格式字符串   决定它需要多少参数。如果你提供一个参数,但是   放入格式说明符,它会假设它有更多的参数   它确实如此,并从堆栈中读取它们。这将导致它打印出来   堆栈内存中的数据用于那些格式字符串。这可以揭示出来   有关攻击者的程序内存状态的信息   谁将格式说明符添加到字符串 - 或 只会导致错误 。    [强调我的]

参与: here here here

缺少 format specifier 是否是您所描述的问题的根源,通常认为使用printf而不使用{{1}}是不好的做法。