C++ 边界检查-越界
我需要一点调试。代码是100%编译就绪的。然而,如果给它一个文档的小片段进行压缩,它就会崩溃,当它解压缩时,它会给出一个关于边界检查的错误。我也有点害怕运行它。这并不危险,但这是我目前的杰作。它正处于压缩技术的最佳状态。这是我编的。它使用微积分推导算法来获得数百万个可使用的唯一密钥。这些都是可以预测的。因为它们是唯一的,我不能在散列中多次使用一个键来搞砸它。这段代码的目的是生成一个完全再生的哈希,并且在压缩过程中不会造成任何损失。多谢各位C++ 边界检查-越界,c++,hashcode,lossless-compression,C++,Hashcode,Lossless Compression,我需要一点调试。代码是100%编译就绪的。然而,如果给它一个文档的小片段进行压缩,它就会崩溃,当它解压缩时,它会给出一个关于边界检查的错误。我也有点害怕运行它。这并不危险,但这是我目前的杰作。它正处于压缩技术的最佳状态。这是我编的。它使用微积分推导算法来获得数百万个可使用的唯一密钥。这些都是可以预测的。因为它们是唯一的,我不能在散列中多次使用一个键来搞砸它。这段代码的目的是生成一个完全再生的哈希,并且在压缩过程中不会造成任何损失。多谢各位 #include <iostream> #i
#include <iostream>
#include <bitset>
#include <vector>
#include <cmath>
#include <fstream>
#include <algorithm>
using namespace std;
class S_Rend {
private:
const bitset<8> beta=0xad;
protected:
bitset<8> alpha, lambda, gamma, omega;
bitset<8> delta, eta, theta, ghost, spec;
vector<long> cred;
public:
unsigned int integral;
S_Rend() { delta=0x00; eta=0x00; theta=0x00; lambda=0x00; alpha=0x00; delta=0x00; };
~S_Rend() { };
int s_render(ifstream&,ofstream&);
int render(ifstream&,ofstream&);
long s_nop(long t, int set);
} n;
/*+**- Project::Sailwinds -**+*/
long S_Rend::s_nop(long t,int set) {
if (set) {
integral=0;
t=(long&)beta;
}
integral++;
if (abs(round((t*1.618)*t-(integral+0.618))-1) <= 4294967296)
return (abs(round((t*1.618)*t-(integral+0.618))-1));
else
return (abs(round(sqrt(t))+(round(sqrt(t))*round(sqrt(integral))+1)));
}
int S_Rend::render(ifstream& in, ofstream& out) {
long bn;
long size=0;
long t;
if (!(in.is_open()))
{ return -1; }
else {
t=(long&)beta;
for_each (std::istreambuf_iterator<char>(in), \
std::istreambuf_iterator<char>(), \
[&] (int x) {
t=s_nop((long&)t,0);
cred.push_back(t);
alpha = (long&)cred[size];
delta = (long&)x;
lambda ^= (alpha ^ delta);
lambda ^= beta;
lambda = (int&)lambda + 1;
size++;
});
printf("*");
}
if (out.is_open())
{ out << lambda << endl;
out << size << endl;
out << delta << endl;
out << cred[size-1] << endl; }
else { return -1; }
in.close();
out.close();
return 0;
}
int S_Rend::s_render(ifstream& in, ofstream& out) {
long i, n;
long size;
long t;
long chk;
in >> lambda;
in >> size;
in >> delta;
in >> chk;
t=(long&)beta;
long bn=0;
while (size-1>=bn) {
t=s_nop((long&)t,0);
cred.push_back(t);
bn++;
}
if (cred[bn-1]==chk)
cout << "\nValidity Pass... Success!" << endl;
else {
printf("\nValidity Pass...Fail! %u != %u",cred[cred.size()-1],chk);
return 1;
}
cout << "\nWriting to Buffer..." << endl;
vector<long> btrace;
vector<long> ltr;
bn=1;
while (size-1>=bn) {
ltr.push_back(1);
btrace.push_back(1);
ltr[0]=(long&)lambda;
for (i=1;i<=btrace.size()-1;i++) {
alpha = (long&)cred[size-bn];
ghost = (long&)btrace[i-1];
spec = (long&)ltr[bn] - 1;
spec ^= (int&)beta;
eta = spec | alpha;
theta = spec & alpha;
omega = spec | eta;
gamma = spec & eta;
if ((eta ^ gamma) == (theta ^ omega)) {
printf(".");
ghost = (eta ^ gamma);
btrace[i-1] = (long&)ghost;
}
}
bn++;
}
cout << "One more second..\n";
bn=0;
while (bn<=btrace.size()-1) {
bn++;
delta = (long&)btrace[bn];
out << (const char)(long&)delta;
}
cout << "\nBuffer Written... Exiting..\n";
in.close();
out.close();
printf("*");
return 0;
}
int main() {
string outfile = "";
string infile = "";
string DC = "1";
printf("Enter <C> or <D> to compress or decompress ");
cin >> DC;
printf("\nInput File: ");
cin >> infile;
ifstream in;
in.open(infile.c_str(), std::ios::in | std::ios::binary);
if (in.fail())
return -1;
printf("\nOutput File: ");
cin >> outfile;
ofstream out;
out.open(outfile.c_str(), std::ios::out);
if (out.fail())
return -1;
if ((DC=="c") || (DC=="C"))
bool f=n.render(in, out);
if ((DC=="d") || (DC=="D"))
bool f=n.s_render(in, out);
printf("\nProgram Execution Done.");
n.~S_Rend();
return 0;
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
S_Rend类{
私人:
常量位集beta=0xad;
受保护的:
位集α、λ、γ、ω;
位集增量、eta、θ、重影、规格;
矢量信使;
公众:
无符号整数;
S_Rend(){delta=0x00;eta=0x00;theta=0x00;lambda=0x00;alpha=0x00;delta=0x00;};
~S_Rend(){};
int s_渲染(ifstream&,ofstream&);
int渲染(ifstream&,ofstream&);
长s_nop(长t,整数集);
}n;
/*+**-项目:帆船-**+*/
长S_Rend::S_nop(长t,整数集){
如果(设置){
积分=0;
t=(长和)β;
}
积分++;
如果(abs(圆形((t*1.618)*t-(积分+0.618))-1)=bn){
t=s_nop((长和)t,0);
信任推回(t);
bn++;
}
如果(cred[bn-1]==chk)
不能输出文件;
流出的液体;
open(outfile.c_str(),std::ios::out);
if(out.fail())
返回-1;
如果((DC==“c”)| |(DC==“c”))
bool f=n.render(in,out);
如果((DC==“d”)| |(DC==“d”))
bool f=n.s_渲染(输入、输出);
printf(“\n程序执行完成”);
n、 ~S_Rend();
返回0;
}
最后一个while循环正在访问索引1(包括!)btrace.size()
:
bn=0;
虽然(bn(int&)beta
是一个错误。这是一个违反严格别名规则的重新解释
。它可能也会访问超出范围;例如位集
可能只有1字节大,但(int&)beta
将从该内存位置读取4个字节
相反,你应该使用beta.to_ulong()
。你在很多地方都会犯同样的错误
移除代码中的所有转换。使用一个CAST(特别是C风格的CAST)告诉编译器“不要警告我这是一个错误,我知道我在做什么”。但是事实上你不知道你在做什么。大多数情况下,C++可以不用使用Cascript编写。
(可能还有其他错误,只有这一个在我第一次阅读时就突出了。请修复所有这些错误,然后再试一次)。@JamesRoot这篇文章的作者特别指出代码有问题(“我需要一点调试”),这将使其脱离代码审查的主题。只有当所有内容都按预期工作时,它才会出现在主题上。@Jamesroot Phrancis是正确的。它缺少一点编辑或打字错误,这将阻止它完全工作。即使仅此而已,它也应该被修复,以进入代码审查的领域。(i=1;iweird,它停止了崩溃。我想我的计算机被所有的信息都吐出来了。@user4581301嘿,它现在怎么了?在s_render
中,它无法输出。虽然它确实生成了文件,但当我通过render
时,它有一个难看的退出消息。更好的是,让它成为for
循环的标准(bn=0;bn
对所有循环使用普通的循环。代码前面还有另一个奇怪的bn while循环。
bn=0;
while (bn<=btrace.size()-1) {
bn++;
delta = (long&)btrace[bn];
out << (const char)(long&)delta;
}