- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
发生的事情是我正在读取加密数据包,我遇到了一个损坏的数据包,该数据包返回一个长度非常大的随机数。
size_t nLengthRemaining = packet.nLength - (packet.m_pSource->GetPosition() - packet.nDataOffset);
seckey.SecretValues.m_data.resize(nLengthRemaining);
在此代码中,m_data 是一个 std::vector<unsigned char>
.由于损坏的数据包,nLengthRemaining 太大,因此调整大小函数抛出。问题不在于调整大小抛出(我们处理异常),而是调整大小已经损坏了内存,这会导致以后出现更多异常。
我想做的是在我调用resize之前知道长度是否太大,然后只有在可以的情况下才调用resize。我试过将此代码放在调整大小的调用之前:
std::vector<unsigned char>::size_type nMaxSize = seckey.SecretValues.m_data.max_size();
if(seckey.SecretValues.m_data.size() + nLengthRemaining >= nMaxSize) {
throw IHPGP::PgpException("corrupted packet: length too big.");
}
seckey.SecretValues.m_data.resize(nLengthRemaining);
此代码使用 std::vector max_size 成员函数来测试 nLengthRemaining 是否更大。不过这一定不可靠,因为 nLengthRemaining 仍然小于 nMaxSize,但显然仍然大到足以导致调整大小出现问题(nMaxSize 为 4xxxxxxxxx,nLengthRemaining 为 3xxxxxxxxx)。
此外,我还不确定抛出什么异常调整大小。它不是 std::length_error 也不是 std::bad_alloc。它抛出什么异常对我来说真的不是太重要,但我很想知道。
顺便说一句,如您所知,这段代码在正常情况下确实可以正常工作。这种数据包损坏的情况是它唯一发疯的地方。请帮忙!谢谢。
更新:
@迈克尔。现在,如果数据包大于 5 MB,我将忽略它。我将与其他团队成员讨论是否可能验证数据包(它可能已经存在,只是我不知道而已)。我开始认为它确实是我们的 STL 版本中的错误,它抛出的异常甚至不是 std::exception,这让我感到惊讶。我会尝试从我的主管那里了解我们正在运行的 STL 版本(我将如何检查?)。
另一项更新:我只是证明它是我在我的 Visual Studio 6 开发机器上使用的 STL 版本中的一个错误。我写了这个示例应用程序:
//VectorMaxSize.cpp :定义控制台应用程序的入口点。//
#include "stdafx.h"
#include <vector>
#include <iostream>
#include <math.h>
#include <typeinfo>
typedef std::vector<unsigned char> vector_unsigned_char;
void fill(vector_unsigned_char& v) {
for (int i=0; i<100; i++) v.push_back(i);
}
void oput(vector_unsigned_char& v) {
std::cout << "size: " << v.size() << std::endl;
std::cout << "capacity: " << v.capacity() << std::endl;
std::cout << "max_size: " << v.max_size() << std::endl << std::endl;
}
void main(int argc, char* argv[]) {
{
vector_unsigned_char v;
fill(v);
try{
v.resize(static_cast<size_t>(3555555555));
}catch(std::bad_alloc&) {
std::cout << "caught bad alloc exception" << std::endl;
}catch(const std::exception& x) {
std::cerr << typeid(x).name() << std::endl;
}catch(...) {
std::cerr << "unknown exception" << std::endl;
}
oput(v);
v.reserve(500);
oput(v);
v.resize(500);
oput(v);
}
std::cout << "done" << std::endl;
}
在我的 VS6 开发机器上,它具有与加密项目相同的行为,它会造成各种破坏。当我在我的 Visual Studio 2008 机器上构建和运行它时,resize 会抛出一个 std::bad_alloc 异常并且 vector 不会被破坏,正如我们所期望的那样!是时候玩 EA Sport NCAA 橄榄球了嘿嘿!
最佳答案
我认为 vector::max_size()
几乎总是一个“硬编码”的东西——它独立于系统/库准备动态分配的内存量。您的问题似乎是 vector 实现中的一个错误,它会在分配失败时破坏事物。
“Bug”这个词可能太强了。 vector::resize()
根据 vector::insert()
定义标准是关于 vector::insert()
的:
If an exception is thrown other than by the copy constructor or assignment operator of T there are no effects
所以似乎有时候 resize()
允许操作破坏 vector ,但如果操作是异常安全的,那仍然很好(我认为期望库这样做并不过分,但也许比我想象的更难)。
你似乎有几个合理的选择:
vector::max_size()
设置 nMaxSize
达到您自己的合理最大值,并按照您的要求执行上述操作,但改用该阈值。编辑:
我看到您使用的是 VC6 - vector::resize()
中肯定存在错误这可能与您的问题有关,但老实说我看不到补丁(实际上这是 vector::insert()
中的错误,但如前所述, resize()
调用 insert()
)。我想访问 Dinkumwares' page for bug fixes to VC6 是值得的并应用修复。
问题也可能与 <xmemory>
有关该页面上的补丁 - 目前尚不清楚那里讨论的错误是什么,但是 vector::insert()
调用_Destroy()
和 vector<>
确实定义了名称 _Ty
所以你可能会遇到那个问题。一件好事 - 您不必担心管理标题的更改,因为 Microsoft 再也不会触及它们。只需确保补丁进入版本控制并记录在案即可。
请注意,Scott Meyers 在“Effective STL”中建议使用 SGI's或 STLPort's库获得比 VC6 更好的 STL 支持。我还没有这样做,所以我不确定这些库的工作情况如何(但我也没有太多地使用 VC6 和 STL)。当然,如果您可以选择迁移到较新版本的 VC,请务必这样做。
再进行一次编辑:
感谢测试程序...
VC6 的 _Allocate()
默认分配器的实现(在 <xmemory>
中)使用带符号的 int 来指定要分配的元素数量,如果传入的大小为负数(这显然是你正在做的 - 当然在你的测试程序中) _Allocate()
函数将请求的分配大小强制为零并继续。请注意,大小为零的分配请求几乎总是会成功(而不是 vector
无论如何都会检查失败),因此 vector::resize()
函数愉快地尝试将其内容移动到新 block 中,至少可以说它不够大。因此堆被损坏,它可能会遇到无效的内存页面,并且无论如何 - 你的程序都被清理了。
所以最重要的是永远不要要求 VC6 分配超过 INT_MAX
的空间。一气呵成的对象。在大多数情况下(VC6 或其他)可能不是一个好主意。
此外,您应该记住 VC6 使用从 new
返回 0 的预标准习语。当分配失败而不是抛出 bad_alloc
.
关于c++ - vector.resize 函数在尺寸太大时破坏内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1615518/
我有一个 View ,不是窗口的大小,也不是窗口本身,当它调整大小时,我想比较调整大小的开始值和结束值。然而,JQ-UI 的 resize ui 对象只包含以前的状态,而不是原始状态,所以它只是按像素
我有一个简单的可调整大小 jQueryUI 元素。 element.resizable({ start: function(event, ui) {...}, resize: func
我有几个嵌套的可调整大小的 div,需要调整大小以适应子大小。一切正常,直到我尝试调整其中一个外部 div 的大小(垂直)然后它卡住了。 这是一个 fiddle . $(function () { $
CNN 模型将大小为 (112x112) 的图像张量作为输入,并给出 (1x512) 大小的张量作为输出。 使用 Opencv 函数 cv2.resize() 或在 pytorch 中使用 Trans
经过大量搜索和研究,我找不到任何答案。 我将非常感谢可以帮助我的人。 在 SWT Java 中, 我希望我的窗口不能调整大小,所以我这样定义它: shell = new Shell(SWT.CLOSE
$(window).bind('resize') 和 $(window).resize() 有什么区别? 我看到bind嵌套在resize之上。它有什么影响?请参阅下面的代码。 我知道.resize(
使用 Vaadin 14.1.19 和 Vaadin“我的入门元素”元素,我尝试创建一个多行 TextArea。乍一看它工作正常,但是当调整 TextArea 大小时,它不会调整行数。这是我的代码:
我有一个使用 Ext.js 的侧面板。在浏览器调整大小之前,侧面板中的其中一个面板很好。浏览器调整大小时,它会切断面板的组件。 如何在浏览器调整大小时调整面板大小? { xtype:
我需要一种可靠的方法来检测 $(window).on('resize') 是否已由用户交互或 jQuery .trigger 调用触发。 我尝试了以下方法,但我似乎没有在函数调用中取回参数: $(wi
我有一个可调整大小的 div,现在我想在调整此框大小/用户完成调整大小时编辑 cookie。 (我有cookie插件) 我该怎么做? PS:我有多个具有不同 id 的 .div。 我的代码不起作用
这些游标类型有什么区别?我在 Chrome/windows 中看到了所有 3 个相同的光标 .e-resize {cursor: e-resize;} .ew-resize {cursor: ew-r
我使用了一个指令,它调用了一个返回一些值的方法,该方法运行良好。但我的问题是它反复调用它,而我想要的是它应该只在调整大小完成时调用该方法。我采取了这种代码形式 https://codepen.io/f
为了检查这种意外行为,我只是将 TextArea 直接放入 PrimaryStage 包含的 Scene 中:在应用程序启动时,TextArea 完全适合窗口(正如预期的那样)。 但是如果我移动窗口的
我在我的项目中使用 jquery-ui-resizable 插件。 默认情况下,当您制作 DOM 对象 jquery-ui-resizable 时,可调整大小的句柄将出现在右下角,我需要在左下角显示可
我正在 MonoTouch 中使用来自 AV Foundation 的 AVPlayer API 开发视频播放器(但 objective-c 中的解决方案也可能不错)。我正在尝试实现全屏模式。 为了显
我只是想让我的响应式 div 示例像这里一样工作 http://voormedia.com/blog/2012/11/responsive-background-images-with-fixed-o
我正在制作一个包含一个 .html 文件和一个 .css 文件的页面。 我已将 bootstrap 4 CDN 合并到我的 html 头中。 网格在中等屏幕尺寸下显示正确,但在我的手机上查看时它没有调
所以我有一个最近出现的非常具体的问题(就在我们计划的明天发布日之前),我不确定如何解决它。我用我有限的前端技能构建了我们的 HTML 模板网站,我们对此非常满意。但是,我似乎无法解决这个问题。 问题:
据我了解,有类instance.method(parameters)=class.method(instance,parameters),所以只是记法上的区别。但是 np.resize(ndarray
window.resize() 和 window.on('resize' , function()) 有什么区别在 jquery 中? 最佳答案 来自 jQuery页面.resize(): This
我是一名优秀的程序员,十分优秀!