我已经读过Stack Overflow,有些C函数是"过时的"或"应该避免".你能告诉我一些这种功能的例子和原因吗?
这些功能有哪些替代方案?
我们可以安全地使用它们 - 任何好的做法?
据我所知,strlcpy和strlcat被设计为安全的替代品strncpy和strncat.然而,有些人仍然认为他们不安全,只是造成不同类型的问题.
有人可以举例说明如何使用strlcpy或strlcat(即一个总是 null终止其字符串的函数)会导致安全问题吗?
Ulrich Drepper和James Antill表示这是事实,但从未提供实例或澄清这一点.
我收到了以下警告
warning C4996: 'std::_Uninitialized_copy0': Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ 'Checked Iterators' c:\program files\microsoft visual studio 10.0\vc\include\memory 348
我似乎无法找到任何有助于打击此警告的信息.通过查看输出,这个警告似乎与Boost.Signals2和auto_buffer有关.
这样可以安全忽略,还是可以以某种方式将其删除?
似乎strncmp通常建议比strcmp,有什么优势?我认为这可能与安全有关.如果是这种情况,如果已知其中一个输入字符串是字面常量,它仍然适用"LiteralString"吗?
更新:
我的意思是在需要比较整个字符串的相同用户场景下,strncmp可以如下使用.我想知道它是否有意义.
strncmp(inputString, "LiternalString", strlen("LiternalString"));
Run Code Online (Sandbox Code Playgroud) 我有一个strcpy到处都在使用的大型项目。我正在考虑使用strcpy_s而不是strcpy. 我想我已经使用了近 10,000 次strcpy。每次都换好麻烦strcpy。有什么有效的转换方法吗?
C11&C++14标准已经删除gets()了本质上不安全的功能并导致安全问题,因为它不会在缓冲区溢出中执行边界检查结果.那为什么C11标准不掉线strcat()和strcpy()功能?strcat()函数不检查第二个字符串是否适合第一个数组.strcpy()函数也不包含检查目标数组边界的规定.如果源数组有多于目标数组可以容纳的字符怎么办?程序很可能会在运行时崩溃.
那么,如果这两个不安全的函数完全从语言中删除,那不是很好吗?为什么他们仍然存在?是什么原因?只有像这样的功能不是很好strncat(),strncpy()吗?如果我没有错,Microsoft C&C++编译器提供了这些功能的安全版本strcpy_s(),strcat_s().那么为什么他们没有正式实施其他C编译器来提供安全性呢?
在Windows下对Visual C编码时,我发现我的自我被迫修改我的代码,因为已弃用的函数,添加第二个参数,当然还有使用安全函数(例如以_s结尾).
我想知道,这些函数是否存在于C标准库中,如果我将它们传输到我的linux分区,我能用C编译器编译它们吗?
当我写一个关于偏移函数的字符串翻转时,我的担忧出现了:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *flipstr(char *str, size_t size, size_t offset);
int main(int , char **)
{
char str[] = "JonSon";
char *p = flipstr(str, sizeof(str), 3);
if (p) {
printf("%s\n", p);
}
return 0;
}
char *flipstr(char *str, size_t size, size_t offset)
{
if (offset > strlen(str)) {
return NULL;
}
char *tmp = (char *)calloc(size, sizeof(char));
strncpy_s(tmp, size, str, offset);
memmove(str, str + offset, strlen(str + offset));
memcpy(str + strlen(str + offset), …Run Code Online (Sandbox Code Playgroud) 我正在用C编写一些程序(很少用C++).通常它们很简单,但通常它们可以变大.
我希望了解有关使用安全版本功能的更多信息,例如strcpy()不安全,并且strcpy_s()是微软新功能的安全版本.
我通常在编写Windows *时使用Visual Studio 2010 我删除了关于Linux的部分 - 仅关注Windows*
我的问题是,如果我使用较新的安全版本,我仍然可以在旧版本的Windows上执行我的程序,例如Windows 95吗?由于要求,我们只能有一个可执行文件.
谢谢.
编辑: 对不起,这只是出现在我脑海中 - 忽略上面的Linux部分.如果我们为Windows编写代码,我不介意它是否不能移植到Linux,我只关心它是否仍适用于旧版本的Windows.
1| typedef struct container{
2| char* abc;
3| }container;
4|
5|
6| int main(void){
7|
8| container* xyz = malloc(sizeof(container));
9|
10| xyz->abc = malloc(10);
11| xyz->abc = "abcdefghi\0";
12|
13| free(xyz->abc);
14| free(xyz);
15| }
Run Code Online (Sandbox Code Playgroud)
根据Valgrind的说法,第10行有泄漏,这意味着免费(xyz-> abc)不起作用.我怎么能解脱这个?