为什么 strlcpy 和 strlcat 被认为不安全?

2024-03-04

我明白那个strlcpy and strlcat被设计为安全替代品strncpy and strncat。但仍有一些人认为他们不安全,并且只会导致不同类型的问题 https://en.wikipedia.org/wiki/C_string_handling#Replacements.

有人可以举例说明如何使用strlcpy or strlcat(即一个函数alwaysnull 终止其字符串)会导致安全问题吗?

乌尔里希·德雷珀 (Ulrich Drepper) 和詹姆斯·安蒂尔 (James Antill) 表示这是正确的,但从未提供示例或澄清这一点。


首先,strlcpy从未被设计为安全版本strncpy (and strncpy从未被设计为安全版本strcpy)。这两个功能完全不相关。strncpy是一个与 C 字符串(即以 null 结尾的字符串)完全无关的函数。事实是它有str...其名称中的前缀只是一个历史错误。历史和目的strncpy是众所周知且有据可查的。这是一个为处理 Unix 文件系统的某些历史版本中使用的所谓“固定宽度”字符串(不是 C 字符串)而创建的函数。如今,一些程序员对其名称感到困惑,并认为strncpy不知何故应该作为有限长度的C字符串复制函数(一个“安全”的兄弟strcpy),这实际上完全是无稽之谈,并导致糟糕的编程实践。当前形式的 C 标准库没有任何有限长度 C 字符串复制的功能。这是哪里strlcpy适合。strlcpy确实是一个真正的有限长度复制函数,为处理 C 字符串而创建。strlcpy正确地完成了有限长度复制函数应该做的一切。人们可以针对它的唯一批评是,遗憾的是,它不是标准的。

第二,strncat另一方面,它确实是一个与 C 字符串一起使用并执行有限长度连接的函数(它确实是strcat)。为了正确使用此函数,程序员必须特别小心,因为此函数接受的大小参数实际上并不是接收结果的缓冲区的大小,而是其剩余部分的大小(也是终止符字符)是隐式计算的)。这可能会令人困惑,因为为了将该大小与缓冲区的大小联系起来,程序员必须记住执行一些额外的计算,这通常被用来批评strncat. strlcat解决这些问题,更改接口,以便不需要额外的计算(至少在调用代码中)。同样,我认为有人可以批评这一点的唯一依据是该功能不标准。另外,函数来自strcat由于基于重新扫描的字符串连接这一概念的可用性有限,因此您在专业代码中不会经常看到 group 。

至于这些功能如何导致安全问题……他们根本不能。它们导致的安全问题不会比 C 语言本身“导致安全问题”更大。你看,很长一段时间以来,人们有一种强烈的情绪,认为 C++ 语言必须朝着发展成某种奇怪的 Java 风格的方向发展。这种情绪有时也会蔓延到 C 语言领域,导致对 C 语言特性和 C 标准库特性的相当无知和强迫的批评。我怀疑在这种情况下我们也可能会遇到类似的事情,尽管我当然希望事情没有那么糟糕。

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

为什么 strlcpy 和 strlcat 被认为不安全? 的相关文章

  • 如何将动态数据写入 MVC 3 Razor 中的页面布局?

    我有带有 Razor 引擎的 MVC 3 C 项目 将动态数据写入 Layout cshtml 的方法和最佳实践是什么 例如 也许我想在网站的右上角显示用户名 该名称来自会话 数据库或基于用户登录的任何内容 更新 我也在寻找将某些数据渲染到
  • 未捕获的安全错误:阻止了具有原点的框架...访问具有原点的框架

    我已经为 SAP 解决方案 无论什么 制作了一个组件 该组件通过 iframe 嵌入到报告中 在 SAP 平台 BO 上部署报告后 我收到此错误 在 Chrome 上 但在 IE 或 FF 上也不起作用 Uncaught SecurityE
  • 如何在 Asp.Net Core 6 中向类型化 HttpClient 添加承载令牌身份验证

    我正在尝试使用 ASP Net Core 6 设置一个 Web api 以便用户可以到达我的端点 然后我使用特权帐户在幕后的 D365 中执行一些工作 我正在使用类型化的 HTTP 客户端 但我不确定如何插入承载身份验证 以便来自该客户端的
  • 为什么迭代器类型推导失败? [复制]

    这个问题在这里已经有答案了 为什么这在 C 中不起作用 为什么我不能限制foo的参数为std vector
  • C# 中输入按键

    我尝试了这段代码 private void textBox1 KeyPress object sender KeyPressEventArgs e if Convert ToInt32 e KeyChar 13 MessageBox Sho
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 弹出 x86 堆栈以访问函数 arg 时出现分段错误

    我正在尝试链接 x86 程序集和 C 我的C程序 extern int plus 10 int include
  • C++ 中可以使用匿名类作为返回类型吗?

    有没有办法在 C 中使用匿名类作为返回类型 我用谷歌搜索这可能有效 struct Test fun 但是这段代码无法编译 错误信息是 新类型不能在返回类型中定义 其实代码没有任何意义 我只是想弄清楚匿名类是否可以用作C 中的返回类型 这是我
  • 在 T4 代码生成中,如何从引用的程序集中获取类型?

    由于 T4 在项目上下文之外运行 因此我无权访问当前程序集或其他程序集 如何注册对引用程序集的访问 然后从中获取类型 我猜您想访问项目中建筑物的程序集 我在下面的示例代码中所做的是将一个名为 TestLib 的项目添加到我的解决方案中 我将
  • C 中的双重否定:是否保证返回 0/1?

    Is x 标准保证返回0 1 请注意 我是not询问 C 其中定义了 bool 类型 是的 在 C99 中 请参阅 6 5 3 3 4 逻辑非运算符的结果 是0如果其操作数的值比较 不等于0 1如果其操作数的值比较等于 0 结果具有类型in
  • 使用正则表达式解析日志文件

    我目前正在为我们的内部日志文件 由 log4php log4net 和 log4j 生成 开发一个解析器 到目前为止 我有一个很好的正则表达式来解析日志 除了一个烦人的一点 一些日志消息跨越多行 我无法正确匹配 我现在的正则表达式是这样的
  • 如何使用 Selenium Webdriver .NET 绑定设置 Chrome 首选项?

    这是我正在使用的 用户代理可以成功设置 而下载首选项则不能 Windows 7 Chrome 26 Selenium dotnet 2 31 2 chromedriver win 26 0 1383 0 ChromeOptions chro
  • 使用 ClosedXML 附加到 excel 文件

    我需要将新数据附加到使用 ClosedXML 创建的现有 Excel 文件中 如何使用 ClosedXML 附加到 Excel 文件 如何获取最后一条记录的行号并将其附加到该行号上 或者还有其他内容 Thanks 打开现有工作簿 然后使用L
  • 在 boost 元组、zip_iterator 等上使用 std::get 和 std::tie

    我有哪些使用选择std get lt gt and std tie lt gt 与增强结构一起 例子 我想使用基于范围的 for 循环在多个容器上进行迭代 我可以实施zip函数 它使用boost zip iterator include
  • 什么是 C++11 扩展 [-Wc++11-extensions]

    我需要一些帮助来了解此错误发生的位置 警告 非静态数据成员的类内初始化是 C 11 扩展 Wc 11 extensions 这是它来自的代码部分 typedef struct Hand bool straight false bool fl
  • 提升shared_from_this<>()

    有人可以用几句话概括一下如何提升shared from this lt gt 应该使用智能指针 特别是从使用绑定函数在 io service 中注册处理程序的角度来看 编辑 一些回复要求提供更多背景信息 基本上 我正在寻找 陷阱 即人们使用
  • 智能感知不显示评论

    如果我在 Visual Studio 2010 中输入类似的内容数据集1 我得到所有可用方法和属性的列表 智能感知 这很好用 但是 如果我在此列表中选择一个方法或属性 我不会得到 if 的描述 例如 如果我有类似的东西 public cla
  • 如何编写完全可移植的 4 字节字符常量的编译时初始化

    遗留 代码大致如下所示 define MAKEID a b c d UInt32 a lt lt 24 UInt32 b lt lt 16 UInt32 c lt lt 8 UInt32 d define ID FORM MAKEID F
  • 从 git 签出后 nuget dll 丢失

    I have a C solution containing different projects On those projects I have some normal nuget packages like Newtonsoft Js
  • C#“var”关键字在 VB.NET 中的等价物是什么?

    例如 我如何获得 VB NET静态类型局部变量是static赋值右侧的表达式的类型 像这样 Dim http msdn microsoft com en us library 7ee5a7s1 aspx我的变量 3 你还需要 选项推断 ht

随机推荐

  • 在 html 文档中标记文本

    假设我有以下标记 h1 Some title h1 p First paragraph p p Second paragraph p 我需要标记文本的某些部分 即 第一段第二段 它看起来像这样 h1 Some title h1 p F p
  • 确定图像相对于页面顶部的位置

    我有 2 张图像需要稍微重叠 我的第一张图片是 logo png 第二张图片是 form png 我的html是 div img src images logo png align left div div img src images f
  • gnuplot - 将字符串变量转换为小写

    如何在 gnuplot 中将字符串转换为小写 这是一个 gnuplot 字符串处理问题 示例 我希望在 gnuplot 脚本中检查用户输入的参数 if tolower ARG2 ohms 因此接受 ohms Ohms 或 OHMS 首选是不
  • 整数除以 3 最快的方法是什么?

    int x n 3 lt make this faster for instance int a n 3 lt normal integer multiplication int b n lt lt 1 n lt potentially f
  • 使用 Python 删除所有 DynamoDB 项目

    如何使用 python boto3 删除 DynamoDB 中的所有项目 我正在尝试这样做 scan table scan with table batch writer as batch for each in scan Items ba
  • J2ME开发不用Java?

    我正在第一次涉足 J2ME 世界 我更喜欢使用函数式语言来进行开发 Scala 曾经支持 CLDC 但已不再维护 Bigloo似乎消失了 解释器 例如 Jython 是不行的 因为 J2ME 应用程序必须很小 至少我的应用程序必须很小 我想
  • GCov可以在windows下使用吗?

    我可以在 Windows 中安装 gcov 工具吗 或者我可以在windows下的eclipse中使用这个工具的插件吗 我对这个工具很陌生 我对这个工具没有任何想法 请帮我获取这个工具的信息 请告诉我在我的机器上运行此工具的要求 我在哪里可
  • YouTube IFRAME 与 YouTube Android 播放器 API

    我计划在我的 Android 应用程序中安装 YouTube 播放器 并找到了两种替代方案 框架API https developers google com youtube iframe api reference或与YouTube An
  • 如何将 Heroku 应用程序链接到私人 Github 存储库?

    我是 Heroku 的新手 我不熟悉部署 管道的用语 我已经安装了 Heroku CLI 并使用以下命令部署了一个应用程序 run heroku create myNewHerokuApp 我的实例现已制作完毕 我在 Github 上有一个
  • 页面部分回发后如何在 UpdatePanel 中保持焦点位置

    我在带有更新面板的页面中有四个控件 最初 鼠标焦点设置为第一个控件 当我将页面部分回发到服务器时 焦点会自动从我按下 Tab 键的控件的最后一个焦点控件移动到第一个控件 有什么办法可以保持最后的焦点吗 看一眼使用自动回发控件在更新面板中恢复
  • 在 Webpack + VueJs 中链接样式表和要求它们有什么区别?

    使用 VueJs 和 Webpack 组合 我发现要包含外部样式表 例如 bootstrap 您可以执行以下两种操作之一 在你的主 js 脚本中 你可能需要这样的样式表 require assets lib bootstrap min cs
  • textContent 与 insideText 之间的区别

    有什么区别textContent and innerText在 JavaScript 中 我可以用吗textContent如下 var logo document getElementsByClassName logo 0 logo tex
  • 如何解决模块中声明了包,但模块不读取它?

    我正在将我的开发环境迁移到另一台电脑 我使用NetBeans 10 打开JDK11 JavaFX 当我将主项目导入 NetBeans 时 出现以下错误 on import java util logging Level import jav
  • 是否有可能构建一个相对快速的无类型 lambda 演算机?

    纯无类型 lambda 演算是一个强大的概念 然而 构建一台供现实世界使用的机器或解释器通常被描述为 接近 不可能 我想对此进行调查 理论上是否可以构建一个相对较快的无类型 lambda 演算机 我所说的相对较快通常是指在相似数量的资源 门
  • IBM Worklight 6.2 - StoragePlugin 上出现错误

    我从 Worklight 6 1 0 1 升级到 6 2 从那时起 我的应用程序停止成功加载 JSONStore 它说找不到类 StoragePlugin 尽管该类实际上存在于 worklight android jar 中 它还在 con
  • Java 中的公共接口和发布接口有什么区别? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我读过这两页 http martinfowler com ieeeSoftware published pdf http martinfo
  • 调试模式或发布模式

    最近 我正在致力于将物理引擎集成到我的图形引擎程序中 在此之前 我总是在调试模式下构建我的程序 因为我觉得调试意味着安全 并且可以提供更多信息让我知道哪里出了问题 在我的程序中 我在Release模式下构建了Assimp 但直到现在我仍然在
  • AngularJS 控制器继承

    AngularJS 具有基于 DOM 的控制器继承 如 Angular 文档中所述 div p Base Controller Value value p div
  • `2>/dev/null` 在 Makefile 中不起作用

    我试图抑制错误rm通过书写命令 生成文件 clean wildcard mod rm 2 gt dev null I ran make clean rm 2 gt dev null make clean Error 64 ignored 我
  • 为什么 strlcpy 和 strlcat 被认为不安全?

    我明白那个strlcpy and strlcat被设计为安全替代品strncpy and strncat 但仍有一些人认为他们不安全 并且只会导致不同类型的问题 https en wikipedia org wiki C string ha