この関数の目的は、文字列を「バッファ」(本質的には別の文字列) にコピーすることです。ただし、この問題は実用的なものよりも複雑すぎるようです。
"Copies at most n-1 characters of string in into the buffer pointed to by
out. If n is reached, returns -2. Otherwise, returns -1 for malformed
input and 0 upon successful completion."
これは私が持っているものです:
#include <stdio.h>
#include <assert.h>
int copyStringN(register char *in, register char *out, register int n){
//Declarations
int i; //Dummy index
if(!in || !out) return -1;
for(i=0; i<n; i++){
*out++ = *in++;
}
*out = '\0';
return 0;
}
int main(void){
//Declarations
char in[] = "I'm not trying to inject malicious code...\\x29A.";
const int N = sizeof(in);
char out[N];
int err;
//Main execution
printf("\nThis function will copy at most n-1 characters of string into\nthe buffer pointed to by out.\n\n");
err = copyStringN(in, out, N);
assert(!err);
printf("%s\n", out);
printf("\nPlease press enter to exit...");
getchar();
return 0;
}
この一般的な形式が提案されましたが、実行する必要があることよりも複雑すぎるようです。なぜn
到達するのでしょうか?の前に実行を停止する必要がありn
ます。さらに、N = sizeof(in)
元の文字列の長さと一致しませんか?
個人的には、より近い関数を使用したいと思います
int copyStringN(register char *in, register char *out)
{
if((!in || !out) && (sizeof(in)<=sizeof(out))) return -1;
else{
while(*t++ = *from++);
return 0;
}
}
int main(void){
//Declarations
char in[] = "I'm not trying to inject malicious code...\\x29A.";
const int N = sizeof(in);
char out[N];
int err;
.
.
.
より少ないステートメントで同じ効果があると思います。これをもっと質問させてください。プロンプトで定義された保護を使用して、文字列を別の配列にコピーする関数をどのように書くことができますか? また、私が提示した 2 つのプログラムは、私が認識できない方法で何らかの脆弱性を持っていますか?
建設的な意見を歓迎します。