迭代器上的限制是否有效

2023-12-06

我在实际生产代码中发现了以下内容。 我怀疑它实际上有未定义的行为,但是,我在 cppreference 上找不到相关信息。您能否确认这是 UB 或有效代码以及为什么这是 UB/有效(最好带有标准引用)?

#include <vector>

int main(int, char **)
{
    auto v = std::vector<int>({1,2,3,4,5});
    auto begin = v.begin();
    auto outOfRange = begin + 10;
    auto end = v.end();
    auto clamped = std::min(outOfRange, end);
    return (clamped == end) ? 0 : 42;
}

编译器资源管理器上的代码

如你看到的begin + 10将创建一个超出范围的迭代器std::vector。 但是,该迭代器并未被使用,因为它是使用std::min.


的操作语义operator+(n),对于随机访问迭代器来说是这样的[随机访问迭代器],表 99 *:

difference_­type m = n;
if (m >= 0)
    while (m--)
        ++r;
else
    while (m++)
        --r;
return r;

And for ++r前提是[输入.迭代器],表 95 *:

前提条件:r是可解引用的。

With begin() + n从某个值开始,这个前提条件将不会得到满足m if n大于容器的尺寸。后begin + 10;你已经有了 UB,其余的代码是无关紧要的。

GCC 标准库清理程序(编译为-D_GLIBCXX_DEBUG)会给你以下错误:

/usr/include/c++/10/debug/safe_iterator.h:885:
In function:
    __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, 
    std::__cxx1998::vector<int, std::allocator<int> > >, 
    std::__debug::vector<int>, std::random_access_iterator_tag>::_Self 
    __gnu_debug::operator+(const _Self&, 
    __gnu_debug::_Safe_iterator<__gnu_cxx::__normal_iterator<int*, 
    std::__cxx1998::vector<int, std::allocator<int> > >, 
    std::__debug::vector<int>, 
    std::random_access_iterator_tag>::difference_type)

Error: attempt to advance a dereferenceable (start-of-sequence) iterator 10 
steps, which falls outside its valid range.

Objects involved in the operation:
    iterator @ 0x0x7fffffffb900 {
      type = __gnu_cxx::__normal_iterator<int*, std::__cxx1998::vector<int, std::allocator<int> > > (mutable iterator);
      state = dereferenceable (start-of-sequence);
      references sequence with type 'std::__debug::vector<int, std::allocator<int> >' @ 0x0x7fffffffb8c0
    }

  • N4659(2017 年 3 月 Kona 工作草案/C++17 DIS)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

迭代器上的限制是否有效 的相关文章

随机推荐

  • javascript eval 可能会带来哪些问题

    我尝试谷歌搜索 但没有得到非常具体的答案 话又说回来 我可能没有使用正确的关键字 有人能指出 javascript eval 可能导致的 安全 问题吗 举个例子 非常好 如果您可以指向具有相同功能的现有网络资源 也可以 Edit 我只需要评
  • MS Access 在传递查询中使用表单

    我有一个名为菲茨 安特 达根 一个名为查询FietsAantDagen和一个名为Txtinput 我正在尝试使用 SQL Server 的直通查询 并使用文本表单的输入作为查询中的输入 Query SELECT Fiets id Fiets
  • 在c++/windows中获取线程状态

    必须有一个函数来获取系统中线程的当前状态 因为有这个应用程序 http www softwareverify com cpp thread status monitor index html 它必须使用某种 API 函数或其他东西 如何在
  • d3嵌套分组条形图

    首先 如果我的英语很难理解 我会尽力的 我对 D3 js 相当陌生 我正在尝试使用嵌套数据创建 D3 分组条形图 我查看了此处共享的一些解决方案 但它们仅显示一级分组 就我而言 数据将来自具有以下数据结构的 csv 文件 groups ca
  • 多次调用 Looper 会导致“向死线程上的处理程序发送消息”

    我使用 Executor 固定线程池 和我自己的 ThreadFactory 添加了 Looper Handler HANDLER new Handler Executor THREADS Executors newFixedThreadP
  • 将 boost::transform_iterator 与非常量函子一起使用

    I want to use a transform iterator to make a delta transformation on a range By delta transformation I mean that r0 shou
  • 你能将 UIImage exif 数据复制到缩放后的 UIImage 中吗?

    我目前正在用户拍照时抓取照片 void imagePickerController UIImagePickerController picker didFinishPickingMediaWithInfo NSDictionary info
  • 升级到 Worklight 6.2

    我在升级到 Worklight 6 2 时遇到问题 请找出下面的错误 ERROR transport error 202 bind failed Address already in use ERROR JDWP Transport dt
  • PHP:将字符串拆分为数组,就像不带分隔符的爆炸一样

    我有一个字符串 例如 0123456789 我需要分开each字符放入数组中 我 为了它 尝试了 explode 123545789 但它给了我明显的信息 警告 爆炸中未定义分隔符 我怎么会遇到这个 我看不到任何方法 尤其是一个函数 arr
  • 在 C# 中生成随机小数

    如何获得随机的 System Decimal System Random不直接支持 编辑 删除旧版本 这与 Daniel 的版本类似 但会给出完整的范围 它还引入了一种新的扩展方法来获取随机的 任何整数 值 我认为这很方便 注意这里小数的分
  • 用于 C++ 的基于行的线程安全 std::cerr

    创建自己的最简单方法是什么std cerr这样它是逐行线程安全的 我最好寻找代码来做到这一点 我需要的是这样a line of output 终止于std endl 由一个线程生成as a line of output当我实际在控制台上看到
  • python3导入语句的变化

    我不明白以下内容pep 0404 在 Python 3 中 包内的隐式相对导入不再 可用 只有绝对导入和显式相对导入 支持的 此外 星号导入 例如 from x import 仅 允许在模块级代码中使用 什么是相对进口 python2中还有
  • C/C++,你可以将文件#include 到字符串中吗? [复制]

    这个问题在这里已经有答案了 我有一个 C 源文件和一个 Python 源文件 我希望 C 源文件能够将 Python 源文件的内容用作大字符串文字 我可以做这样的事情 char python code include script py 但
  • Nestjs:猫鼬中子文档数组的正确模式(没有默认_id或重新定义ObjectId)

    我正在使用 Nest js 并尝试使用包含子文档字段数组的装饰器创建一个架构 我在导入 导出架构并将其转换为模型方面没有任何麻烦 直到 我在我的中收到以下错误service file 经过几个小时的谷歌搜索后 我发现真正的原因是array子
  • 为什么同一文件中的全局符号需要重新定位?

    我有一个用于测试的 C 程序 a c int a 0 static int fa local a 78 int b int c int fa global a 7777 fa local int test a 6666 fa global
  • python程序在sublime text 3中执行失败,但在bash中执行成功[重复]

    这个问题在这里已经有答案了 encoding utf 8 from future import absolute import division print function unicode literals text 我们的世界充满了未知
  • Select MAX(field)+1 FROM ... 并发问题

    您好 我担心合作伙伴应用程序的并发性 因为最近几天它在 CRUDS 操作方面遇到了麻烦 尤其是在插入方面 所以我运行 SQL Profiler 并注意到他的插入语句不使用事务 而且他正在使用 INSERT INTO TABLEA VALUE
  • 节点“req 未定义”

    当我尝试启动以下脚本时 var http require http http createServer function request response response writeHead 200 Content Type text p
  • Groovy 调用运算符在类字段上使用时会抛出 MissingMethodException

    我正在尝试使用呼叫操作员 重载 但它不适用于类字段 怎么了 class Foo void call int x println x x class MyCallable Foo foo new Foo Foo foo new Foo foo
  • 迭代器上的限制是否有效

    我在实际生产代码中发现了以下内容 我怀疑它实际上有未定义的行为 但是 我在 cppreference 上找不到相关信息 您能否确认这是 UB 或有效代码以及为什么这是 UB 有效 最好带有标准引用 include