C++ 铸造是否会导致问题?

C++ 铸造是否会导致问题?,c++,casting,C++,Casting,在一个RTO中,我调试的一个问题是,当程序将8位值(我们称之为“Int8 rogue_int”)发送给一个函数(我们称之为“Infected(Int16)”)时,该函数的定义是将该变量作为16位变量,程序总是会崩溃一点。在进入最后一个受感染的函数(..)之前,“rogue_int”的值是正确的,但一旦进入受感染的函数(..)fn,它就有一些垃圾值,并点击断言。通常情况下,我的想法是将8位变量转换为16位变量不会导致任何问题,但在这两者之间不可能存在任何其他可能损坏静态内存的问题 我对它进行了很多

在一个RTO中,我调试的一个问题是,当程序将8位值(我们称之为“Int8 rogue_int”)发送给一个函数(我们称之为“Infected(Int16)”)时,该函数的定义是将该变量作为16位变量,程序总是会崩溃一点。在进入最后一个受感染的函数(..)之前,“rogue_int”的值是正确的,但一旦进入受感染的函数(..)fn,它就有一些垃圾值,并点击断言。通常情况下,我的想法是将8位变量转换为16位变量不会导致任何问题,但在这两者之间不可能存在任何其他可能损坏静态内存的问题

我对它进行了很多思考,并提出了一些理论,因为这是在一段时间后(让我们说2-3小时的执行时间)命中断言,所以最初静态内存是好的、干净的,不会朝堆方向增长,但当它在将8位转换为16位的过程中增长时,它会从实际no(这里是rogue_int)中减去8位但它需要额外的8位内存块,刚刚分配给这个变量,使其成为16位。这个新添加的8位可能已损坏,这可能使“完全否”无效


我的问题是,上面的第二个参数对C++专家有什么意义?8-16投法是否总是安全的(我一直认为它总是安全的,这就是为什么我没有把我的想法交给更高的人)??如果你认为我错了,那么请建议可能导致这个问题的替代方案。(断言,只有在函数‘感染’(…)”中的某一点看到了命中……没有任何其他地方)< /P> < P>我不是C++专家,但你所描述的没有任何意义。从8位类型强制转换为16位类型不会导致未初始化的内存被合并到值中——这种类型的向上转换具有狭窄的、严格指定的语义,编译器不能只获取额外的相邻字节并将其添加到值中


您所描述的内容听起来像是来自程序其他部分的缓冲区溢出。我建议使用ValgRIND(Linux)或AppExistor(Windows)等验证工具来检查您的内存访问,并在其源代码中找到缓冲区溢出。

< P>我不是C++专家,但您所描述的没有任何意义。从8位类型强制转换为16位类型不会导致未初始化的内存被合并到值中——这种类型的向上转换具有狭窄的、严格指定的语义,编译器不能只获取额外的相邻字节并将其添加到值中


您所描述的内容听起来像是来自程序其他部分的缓冲区溢出。我建议使用valgrind(Linux)或AppVerifier(Windows)等验证工具检查内存访问,并在其源位置查找缓冲区溢出。

将整数转换为更大的整数总是安全的

听起来您的程序在某个地方出现了堆栈损坏问题,覆盖了函数参数的值


您的第二段有点道理,因为这类错误的一个潜在原因是堆栈和堆之间的冲突(即内存不足),但您所表达的逻辑基本上是错误的。
函数的参数是参数的副本。当您调用
Infected(rogue\u int)
时,系统并不是在运行时将
rogue\u int
的分配扩展到16位,而是为参数分配一个16位宽的新变量,然后将8位
rogue\u int
的值复制到其中。参数
rogue\u int
本身的值和分配没有被修改,因此肯定不是
rogue\u int
的末尾加了另一个未初始化的8位。

将整数转换为更大的整数总是安全的

听起来您的程序在某个地方出现了堆栈损坏问题,覆盖了函数参数的值


您的第二段有点道理,因为这类错误的一个潜在原因是堆栈和堆之间的冲突(即内存不足),但您所表达的逻辑基本上是错误的。
函数的参数是参数的副本。当您调用
Infected(rogue\u int)
时,系统并不是在运行时将
rogue\u int
的分配扩展到16位,而是为参数分配一个16位宽的新变量,然后将8位
rogue\u int
的值复制到其中。参数
rogue\u int
本身的值和分配没有被修改,因此肯定不是
rogue\u int
的末尾加了另一个未初始化的8位。

代码通常会有所帮助。问题的英文描述几乎总是缺少帮助所需的详细信息。此外,由于您处于RTOS环境中,信息如您是否处于中断处理程序vs应用程序空间中,可能是平台/开发环境中,您是否自己移植了RTOS或它是否已被集成,等等。。。可能是相关的代码通常有帮助。问题的英文描述几乎总是缺少帮助所需的详细信息。此外,由于您处于RTOS环境中,信息如您是否处于中断处理程序vs应用程序空间中,可能是平台/开发环境中,您是否自己移植了RTOS或它是否已被集成,等等。。。可能是相关的嗨,亨利,你是绝对正确的。似乎,我有这些疯狂的理论只是为了通过这个问题。谢谢你提醒我这些基本知识。嗨,亨利,你说得对极了。似乎,我有这些疯狂的理论只是为了通过这个问题。谢谢你提醒我基本知识。嗨,刘海,谢谢你的想法。正如我在上面写的那样,我提出了一些理论,其他一些我无法想到的理论。我想我应该再次寻找任何可能的内存泄漏。再次感谢…嗨,刘海,谢谢你的想法