当前位置: 首页 > 知识库问答 >
问题:

为什么会发生这种情况的想法?打印使我的代码工作

程项禹
2023-03-14

我有下一个代码,基本上它所做的是读取按钮状态,如果它被按下,那么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个答案

易俊友
2023-03-14

您有未定义的行为,如注释中所述。如前所述,它可能是我们看不到的东西,也可能是第一行:

printf("\r\n");

编辑:我认为重要的是要指出,正如@dbush在评论中提到的那样,使用非常量参数时会带来危险。这些都是有问题的,因为它可能会以开发人员不希望的方式更改格式字符串。由于本例使用的是文本字符串参数,因此不存在这种危险。

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

因为printf是一个varargs函数,所以它使用格式字符串来决定它需要多少参数。如果您提供了一个参数,但放入了格式说明符,它将假定它有比实际多的参数,并将它们从堆栈中读取。这将导致它从堆栈内存中打印出这些格式字符串的数据。这可能会向向字符串中添加格式说明符的攻击者泄露有关程序内存状态的信息,或者只会导致错误。[重点矿井]

参考:这里,这里和这里。

无论缺少格式说明符是否是您描述的问题的根源,在没有格式说明符的情况下使用printf通常被认为是不好的做法吗?

 类似资料:
  • 安装问题 PS C:\Users\Administrator sharp@0.21.3安装C:\用户\管理员\gatsby-site3\node_modules\锐(节点安装/libvips 使用缓存的C:\Users\Administrator\AppData\Roaming\npm-cache\u libvips\libvips-8.7.0-win32-x64.tar.gz info shar

  • 问题内容: 因此,当我发现一些非常奇怪的东西时,我正在使用Node.js REPL和Underscore库。如果I ,则该变量是全局设置的(显然)。然后,当我尝试运行一个简单的命令时,它会打印出来(显然,再次)。但是,此后立即运行,因为变量设置为,它会打印。 为什么这样做呢?如果我从js文件运行相同的代码,则不会发生。这是正常的Node事情,还是全部错误? 仅供参考:节点v0.10.10 问题答案

  • 根据Java教程 将包装类型(整数)的对象转换为其相应的基元(int)值称为取消装箱。当包装类的对象为: 作为参数传递给需要相应基元类型的值的方法 分配给相应基元类型的变量 为什么在这种情况下会发生拆箱? 在这种情况下,这些事情发生在哪里?是否有管理数组中元素访问的底层方法?或者[]暗示某种变量?

  • reactive 收集依赖不是要通过 Proxy 触发 get 吗,为什么这里只是打印 obj(没有触发 get),也能够收集到依赖?

  • 我关闭了我的android项目,突然当我想再次打开我的项目时,它给了我错误??? 错误:无法解析“:app@debugandroidtest/compileclasspath”的依赖项:无法解析AndroidX.test:runner:1.2.0. 错误:无法解析“:app@debugandroidtest/compileclasspath”的依赖项:无法解析Androidx.test.ext:J

  • Python中的字符串是不可变的,这意味着该值不能更改。我正在测试该场景,但看起来原始字符串已被修改。我只是想理解这个概念