【问题标题】:identify volatile declaration in debug information / disassembly在调试信息/反汇编中识别 volatile 声明
【发布时间】:2014-06-17 14:06:05
【问题描述】:

我正在寻找一种创造性的解决方案,以确保传递给特定宏的变量在 C 语言中使用 volatile 类型声明,并使用 TMS470 编译器。意思:

好方法:

volatile int   *_p_reg;
VOLATILE_MACRO(_p_reg);

编译失败:

int   *_p_reg;
VOLATILE_MACRO(_p_reg);

我希望在编译后执行验证,这意味着检查反汇编或调试信息并识别那些调用。 我似乎在调试信息中找不到任何 volatile 的证据。

有什么想法吗?

谢谢!

【问题讨论】:

  • 我怀疑实现这一点的唯一方法是在编译时生成错误。生成代码后,您可能会丢失任何可能对您有帮助的信息。
  • 1.如何在编译时使编译失败? (因为它不是 cpp ......)。 2.有没有办法从调试信息中确定挥发物?
  • 我想C11的时尚_Generic关键字可以用于这个目的。虽然更...通用的解决方案是获得一个比 C 编译器具有更严格类型检查的静态分析器。
  • 您也可以为此进行 gcc 扩展 - 我有一个编译时和运行时解决方案,我刚刚测试过它们似乎可以工作 - 让我知道这是否可能有用(即,如果您可以安全地假设 gcc 或与 gcc 兼容的编译器),我将发布详细信息作为答案。
  • Lundin - _Generic 对我来说是一个很好的解决方案,我只需要确定 TMS470 是否支持这个选项是不是很重要。它也算作 gcc 扩展吗?

标签: c volatile post-processing tms


【解决方案1】:

我不希望有,但当然这完全取决于编译器。

您当然可以重新构建它,以便宏完成整个定义,即

#define VOLATILE_MACRO(t, p) volatile t p

并像这样使用它:

VOLATILE_MACRO(int, _p_reg);

当然,这可能不适合你。

【讨论】:

  • 谢谢!但是宏非常通用,假设服务于多个模块,声明不是宏的一部分,因为它正在执行位操作。我正在寻找一种创造性的方式来“强制”开发人员仅在 volatile 上使用此宏
【解决方案2】:

使用 gcc 扩展的两种可能的解决方案。运行时版本使用__builtin_types_compatible_passert。编译时版本类似,但使用 hack 来获取在编译时触发的静态断言(尽管带有相当神秘的错误消息):

运行时

#include <stdio.h>
#include <assert.h>

#define VOLATILE_MACRO(p) \
    assert (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)))

int main()
{
    volatile int * x;
    int * y;

    VOLATILE_MACRO(x);  // <<< OK
    VOLATILE_MACRO(y);  // <<< run-time error

    return 0;
}

编译时

#include <stdio.h>
#include <assert.h>

#define A                      BUILD_NAME(__LINE__)
#define BUILD_NAME(line)       BUILD_NAME2(line)
#define BUILD_NAME2(line)      assert_ ## line
#define STATIC_ASSERT(test)    typedef char A[(test) ? 1 : -1]

#define VOLATILE_MACRO(p) \
    STATIC_ASSERT (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)))

int main()
{
    volatile int * x;
    int * y;

    VOLATILE_MACRO(x);  // <<< OK
    VOLATILE_MACRO(y);  // <<< compile error

    return 0;
}

请注意,如果您需要支持其他 volatile 类型,则可以使用多个链接的 __builtin_types_compatible_p 测试简单地扩展宏,例如

#define VOLATILE_MACRO(p) \
    assert (__builtin_types_compatible_p(typeof(p), typeof(volatile int *)) ||
            __builtin_types_compatible_p(typeof(p), typeof(volatile short *)))

【讨论】:

  • 非常感谢我的朋友。我一定会用那个。
猜你喜欢
  • 2017-05-19
  • 2016-03-14
  • 2013-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-22
  • 2021-04-14
  • 1970-01-01
相关资源
最近更新 更多