为什么 Tcler 建议支撑你的“表达”?

2023-12-21

我们可以用两种可能的方式评估两个表达式:

   set a 1
   set b 1
   puts [expr $a + $b ]
   puts [expr {$a + $b } ]

但为什么讨厌经验丰富的 Tclers 第一个,并认为这是不好的做法呢? 第一次使用是否expr有一些安全问题吗?


“问题”与expr是它实现了自己的“迷你语言”,其中包括变量替换(替换那些$a-s 及其值)和命令替换(替换那些[command ...]与运行结果有关的事情commands),所以基本上评估的过程expr $a + $b是这样的:

  1. Tcl 解释器解析出四个单词 -expr, $a, + and $b超出源字符串。由于其中两个词开头为$,变量替换发生,所以真的会有expr, 1, +, and 2.
  2. 通常,第一个单词被视为命令的名称,其他单词是它的参数,因此 Tcl 解释器会查找名为的命令expr,并传递三个参数来执行它:1, +, and 2.
  3. 实施如果expr then 连接起来所有传递给它的参数将它们解释为字符串,获得一个字符串1 + 2.
  4. 那么这个字符串就是再次解析——这一次由expr机器,根据它自己的规则,包括变量和命令替换,如已经提到的。

接下来是:

  • If you brace your expressions http://wiki.tcl.tk/10225, like in expr {$a + $b}, grouping provided by those curly braces inhibits interpretation by the Tcl interpreter1 of the script intended to be parsed by expr itself. This means in our toy example the expr command would see exactly one argument, $a + $b, and will perform substitutions itself.
  • 上面解释的“双重解析”可能会导致安全问题。

    例如,在下面的代码中

    set a {[exec echo rm -rf $::env(HOME)]}
    set b 2
    expr $a + $b
    

    The expr命令本身会解析一个字符串[exec echo rm -rf $::env(HOME)] + 2。它的评估将会失败,但到那时,您的主目录的内容将会消失。 (请注意,一种 Tcler 放置echo在...前面rm在稍后编辑我的答案时,试图拯救随机复制者的脖子,因此所写的命令不会调用rm但如果你删除echo从它开始,它就会。)

  • 双重解析抑制了 Tcl 引擎在处理调用时可以进行的某些优化expr.

1 Well, almost — "backslash+newline" sequences are still processed even inside {...} blocks http://www.tcl.tk/man/tcl8.6/TclCmd/Tcl.htm#M16.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 Tcler 建议支撑你的“表达”? 的相关文章

  • 在 IntelliJ 中禁用运行窗口的显示

    在 IntelliJ 中 每次我更改代码并随后运行应用程序时 都会自动弹出 运行窗口 有什么方法可以禁用这种烦人的行为 或者如何让它不那么分散注意力 我终于可以解决这个问题了 至少它对我有用 在 运行 调试配置 窗口底部的 启动之前 部分

随机推荐

  • 使用 SetParent 窃取另一个进程的主窗口,但保持消息循环分离

    背景 我和我的同事正在维护我们继承的一个百万行遗留应用程序 它的前端是用 VB6 编写的 由于我们投入了几乎所有的资源将其转换为 C 因此我们正在寻找针对我们的特定问题的快速而肮脏的解决方案 该应用程序以插件式的方式运行 最多可以在网格样式
  • iOS 中场景和视图的区别

    我是 iOS 新手 无法理解场景和视图之间的区别 不幸的是苹果的文档对我没有帮助 我读到场景就是你在屏幕上看到的 但这不正是视图吗 这两个术语可以互换吗 如果不是 功能和最佳实践有何区别 ViewController 如何在这两者中发挥作用
  • 自动布局,插入视图填充容器视图

    我试图使插入的视图填充它所插入的容器视图 但是我得到了 无效参数不满足 constraint isKindOfClass NSLayoutConstraint class void insertedView NSView insertedV
  • pandas - read_sql_query() 上的 cdecimal.ConversionSyntax invalidOperation

    我在使用数据库时遇到 Pandas read sql query 函数的问题decimal数据类型 我在使用下面的相同代码时没有任何问题varchar or integer types 版本信息 CentOS 6 6 Python 2 7
  • ExpectedException 未捕获异常,但我可以使用 try catch 捕获它

    对这个有什么想法吗 我正在尝试编写一个单元测试 该测试将删除一个项目 并通过尝试按其 ID 检索该项目来确认该项目不再位于存储库中 这会引发 DataAccessException 然而 测试一直失败 我添加了一个 try catch 块
  • 在画布上填充多边形

    如何填充我用红色绘制的路径 http jsfiddle net MVXZu 1 http jsfiddle net MVXZu 1 我尝试使用 fill 但它没有按照我想要的方式填充我的路径 即填充红色轮廓 但它只填充对角线部分 注释掉 c
  • AddFontResource + SetCurrentConsoleFontEx 不会更改控制台字体

    我正在尝试将控制台字体更改为自定义字体 但是这个特定的代码片段似乎没有完成任何事情 尽管这是我在尝试在互联网上寻找解决方案时想到的 我通过手动安装并使用注册表将其添加到控制台 使用此自定义字体测试了 SetCurrentConsoleFon
  • android edittext inputfilter应该接受空格,字符和数字

    street EditText findViewById R id street InputFilter filter new InputFilter public CharSequence filter CharSequence sour
  • 无法解析导入 javax.servlet [重复]

    这个问题在这里已经有答案了 我正在尝试使用eclipse for Java EE开发网络应用程序 我需要使用Tomcat as my server 我已经下载了 Tomcat 并且它正在运行 但我的程序无法编译 我收到以下错误 无法解析导入
  • 全宽水平导航栏,其中项目间隔均匀

    初始点 终点 我试图让水平导航栏填满 100 的容器 在第一个示例中 您将看到所有项目都左对齐 我试图让它填充容器的整个宽度 如第二个示例所示 我希望所有项目之间的间距保持一致 与显示的方式不同 我只是快速将其放在一起 以便让您了解我正在尝
  • 如何使用 CSS 根据页面中另一个元素的状态选择一个元素?

    我有可以反映不同状态的元素 或者由用户触发 hover focus等 或由服务器操纵 data status finished disabled ETC 我可以定位状态已更改的元素 但我似乎无法找到一种方法来根据相关元素的状态定位 DOM
  • 如何在 PHP 中拆分 CSV 文件?

    我有一个很大的 CSV 文件 我想根据其中一个字段中的值将此文件分成单独的文件 这就是我所做的 使用 fgetcsv 我将 CSV 转换为数组 并使用in array 我检查内容并显示它是否包含数组中的字符串 我将从另一个文本文件迭代获取比
  • 关于多遍排序算法

    我在读编程珍珠作者 乔恩 本特利 参考 http www cs bell labs com cm cs pearls sec013 html 这里作者提到了各种排序算法 如合并排序 多遍排序 问题 合并排序算法如何通过读取输入文件一次并使用
  • 使用 axios 执行经过身份验证的请求时,Jest 返回“网络错误”

    这对我来说似乎有点奇怪 我正在尝试使用 Jest 测试实际 即真实网络 请求 这些是经过测试的场景 测试没有标头的外部 API fixer io 使用标头测试本地 API 服务器 使用以下标头测试相同的本地 APInode终端 这种行为背后
  • 处理用户控件内部的RequiredFieldValidator

    我有一个用户控件 其中包含一个带有一些附加功能的文本框 但出于本示例的目的 只需假设它是一个纯文本框就足够了 我从 Web 表单调用此用户控件 并希望能够使用RequiredFieldValidator 其功能基本上与我在 Web 表单上的
  • 更改 MVC4 中的默认 ValidationSummary 模板

    我想更改默认值Html ValidationSummary 模板以使其与 twitter bootstrap 一起使用 我在哪里可以找到它 我发现的唯一线索是this https stackoverflow com questions 52
  • 展平列表列表的 3 种方法。有理由选择其中之一吗?

    假设我们有一个列表如下 CoreResult有一个类型字段List
  • 如何使用 CSV 文件中的数据运行 XUnit 测试

    有没有办法运行数据驱动XUnit测试使用CSV文件作为数据源 我试过了Cavity Data XUnit 但它不再与最新版本兼容XUnit 到目前为止 我只能使用 Excel 文件来实现这一点 但我需要将它们更改为CSV反而 一个例子 Th
  • Lollipop 上的旋转器出现故障

    我的 Android 项目构建目标是 5 1 1 API 22 这个应用程序似乎适用于除 Lollipop 之外的所有操作系统版本 Lollipop 重新调整了某些活动的高度 否定可滚动布局 并扰乱了旋转器 单击微调器上的特定位置将在应用程
  • 为什么 Tcler 建议支撑你的“表达”?

    我们可以用两种可能的方式评估两个表达式 set a 1 set b 1 puts expr a b puts expr a b 但为什么讨厌经验丰富的 Tclers 第一个 并认为这是不好的做法呢 第一次使用是否expr有一些安全问题吗 问