- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 gcc 的 -finstrument-functions
选项。为了尽量减少开销,我只想检测几个函数。但是,gcc 只允许您将函数列入黑名单(使用 no_instrument_function
属性,或通过提供路径列表)。它不允许您白名单函数。
所以我写了一个小的 gcc 插件,添加了一个 instrument_function
属性。这让我可以为特定函数设置检测“标志”(或者更确切地说,清除无检测标志):
tree handle_instrument_function_attribute(
tree * node,
tree name,
tree args,
int flags,
bool * no_add_attrs)
{
tree decl = *node;
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(decl) = 0;
return NULL_TREE;
}
但是,根据我的理解,这是行不通的。查看 gcc 源代码,要使此标志真正发挥作用,您还需要使用 -finstrument-functions
。参见 gcc/gimplify.c:14436
:
...
/* If we're instrumenting function entry/exit, then prepend the call to
the entry hook and wrap the whole function in a TRY_FINALLY_EXPR to
catch the exit hook. */
/* ??? Add some way to ignore exceptions for this TFE. */
if (flag_instrument_function_entry_exit
&& !DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT (fndecl)
/* Do not instrument extern inline functions. */
&& !(DECL_DECLARED_INLINE_P (fndecl)
&& DECL_EXTERNAL (fndecl)
&& DECL_DISREGARD_INLINE_LIMITS (fndecl))
&& !flag_instrument_functions_exclude_p (fndecl))
...
它首先检查全局 -finstrument-functions
标志是否启用。然后它检查特定功能的标志,据我所知,默认情况下启用该标志。因此,所有其他没有我的 instrument_function
属性的函数仍将被检测。
有没有一种方法可以先为所有函数清除此标志,然后处理我的 instrument_function
属性以仅为这些函数设置标志?
最佳答案
诀窍只是定义属性,但实际上并没有使用任何处理函数,而是在其他地方进行处理。
我们仍然使用 -finstrument-functions
首先为所有函数启用检测。我们可以为 PLUGIN_FINISH_PARSE_FUNCTION
注册一个回调,它会检查所有内容。对于每个函数声明,它都会检查其属性。如果它有 instrument_function
属性,它会像往常一样设置仪器的标志,以便稍后添加。如果函数没有该属性,它会清除标志。
#include <stdio.h>
#include "gcc-plugin.h"
#include "plugin-version.h"
#include "tree.h"
int plugin_is_GPL_compatible;
static struct plugin_info info = {
"0.0.1",
"This plugin provides the instrument_function attribute.",
};
static struct attribute_spec instrument_function_attr =
{
"instrument_function",
0,
-1,
false,
false,
false,
NULL, // No need for a handling function
};
static void register_attributes(void * event_data, void * data)
{
register_attribute(&instrument_function_attr);
}
void handle(void * event_data, void * data)
{
tree fndecl = (tree) event_data;
// Make sure it's a function
if (TREE_CODE(fndecl) == FUNCTION_DECL)
{
// If the function has our attribute, enable instrumentation,
// otherwise explicitly disable it
if (lookup_attribute("instrument_function", DECL_ATTRIBUTES(fndecl)) != NULL_TREE)
{
printf("instrument_function: (%s:%d) %s\n",
DECL_SOURCE_FILE(fndecl),
DECL_SOURCE_LINE(fndecl),
get_name(fndecl));
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(fndecl) = 0;
}
else
{
DECL_NO_INSTRUMENT_FUNCTION_ENTRY_EXIT(fndecl) = 1;
}
}
}
int plugin_init(
struct plugin_name_args * plugin_info,
struct plugin_gcc_version * version)
{
register_callback(
plugin_info->base_name,
PLUGIN_INFO,
NULL,
&info);
register_callback(
plugin_info->base_name,
PLUGIN_FINISH_PARSE_FUNCTION,
handle,
NULL);
register_callback(
plugin_info->base_name,
PLUGIN_ATTRIBUTES,
register_attributes,
NULL);
return 0;
}
关于gcc - 创建自定义 gcc 属性以检测特定函数 : whitelisting, 未列入黑名单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57239704/
我正在尝试从另一个网站远程连接到 SQL。我进行了 whois 查找以获取尝试连接的域的 IP 地址并将其列入 cPanel 中的白名单。我还执行了 echo $_SERVER['SERVER_ADD
Microsoft SmartScreen,以其消息而闻名: Windows Defender SmartScreen prevented an unrecognized app from start
我有一个由多个 .aspx 页面组成的 ASP.NET 应用程序。我希望其中一个 .aspx 页面只能由一组特定的 IP 访问。这可能吗? 我知道您可以在网站级别将 IP 列入白名单,但是您可以将应用
我是一名优秀的程序员,十分优秀!