这是受到这个问题以及对一个特定答案的评论的启发,我strncpy在C 中学到了这不是一个非常安全的字符串处理函数,它会填充零,直到它到达n,我不知道的东西.
具体来说,引用R ..
strncpy不会为null终止,并且会对目标缓冲区的其余部分进行空填充,这是一个巨大的浪费时间.您可以通过添加自己的空填充来解决前者,但不能添加后者.它从未打算用作"安全字符串处理"功能,但是用于处理Unix目录表和数据库文件中的固定大小字段.snprintf(dest,n,"%s",src)是标准C中唯一正确的"安全strcpy",但它可能会慢很多.顺便说一下,截断本身可能是一个主要的错误,并且在某些情况下可能会导致权限提升或DoS,因此抛出"安全"字符串函数会在问题中截断其输出并不是使其"安全"或"安全".相反,您应该确保目标缓冲区的大小合适,并且只需使用strcpy(或者更好的是,如果您已经知道源字符串长度,则使用memcpy).
请注意,strncat()在其接口中比strncpy()更令人困惑 - 这个长度参数到底又是什么?根据你提供的strncpy()等,它不是你所期望的 - 所以它甚至比strncpy()更容易出错.为了复制字符串,我越来越认为有一个强烈的论据,你只需要memmove(),因为你总是提前知道所有的大小,并确保提前有足够的空间.使用memmove()优先于strcpy(),strcat(),strncpy(),strncat(),memcpy()中的任何一个.
所以,我在C标准库上显然有些生疏.因此,我想提出一个问题:
哪些C标准库函数使用不当/可能导致/导致安全问题/代码缺陷/效率低下?
为了客观性,我有一些答案的标准:
请避免:
由于这可能被认为是主观的,并且没有明确的答案,我正在为社区维基立刻做好准备.
我也按照C99工作.
我有.net 3.5,我想制作一个通用的方法.我该如何重构这段代码?
case (int)Enums.SandwichesHoagies.Cheeses:
if (this.Cheeses.Where(x => x.Id == product.ProductId).SingleOrDefault() == null)
{
var newCheese = new Cheese
{
Id = product.ProductId,
Name = product.Name,
PriceValue = product.Price.HasValue ? (double)product.Price.Value : 0.00
};
this.Cheeses.Add(newCheese);
}
else
{
foreach (var cheese in this.Cheeses.Where(cheese => cheese.Id == product.ProductId))
{
this.Cheeses.Remove(cheese);
break;
}
}
foreach (var cheese in Cheeses) cheese.Type = string.Empty;
if (this.Cheeses.Count > 0) Cheeses.First().Type = "Cheeses:";
break;
case (int)Enums.SandwichesHoagies.Meats:
if (this.Meats.Where(x => x.Id == product.ProductId).SingleOrDefault() == null)
{
var newMeat …Run Code Online (Sandbox Code Playgroud) 假设一个字符串是一个数字系统,其中每个东西,它可以是char,DEL或任何ASCII的东西,根据这个ASCII 表具有相应的数字.如何在Python中将属性的任意字符串转换为数字?
一个例子
#car = 35*128**3+99*128**2+97*128**1+114*128**0=75034866
Run Code Online (Sandbox Code Playgroud) NumPy具有有效的函数/方法nonzero()来识别ndarray对象中非零元素的索引.什么是最有效的方式来获得该元素的索引做具有零值?
我想为我的一个模型创建一些验证,其中包含位置信息(街道,地点,邮政编码等).我希望能够根据选择的国家/地区更改验证规则.
例如,postal_code的验证规则对于美国和加拿大将是不同的.此外,一些国家没有邮政编码,因此不需要验证规则.
我将如何实现这样的事情?
Smarty抱怨权限.我为我正在研究的项目编写了一个小的mvc框架,我需要能够在每个控制器中呈现模板.我继续按照Smarty安装说明进行操作,并在我的"前端控制器"或将请求路由到应用程序其余部分的页面中设置所有配置选项.testinstall函数说一切都是犹太洁食,但当我尝试在控制器中渲染模板时,我最终得到了这个.
警告:mkdir():第28行/var/www/HRTRL/includes/CallLog/lib/Smarty/libs/sysplugins/smarty_internal_write_file.php中的权限被拒绝警告:重命名(/ tmp/wrt6piczo,./ templates_c/73b1662b4c376f493278f9873564df03430a0b43.file .poopy.tpl.php):第48行/var/www/HRTRL/includes/CallLog/lib/Smarty/libs/sysplugins/smarty_internal_write_file.php中没有这样的文件或目录警告:chmod():没有这样的文件或目录在/var/www/HRTRL/includes/CallLog/lib/Smarty/libs/sysplugins/smarty_internal_write_file.php第50行警告:include(./ templates_c/73b1662b4c376f493278f9873564df03430a0b43.file.poopy.tpl.php):无法打开流:第423行/var/www/HRTRL/includes/CallLog/lib/Smarty/libs/sysplugins/smarty_internal_template.php中没有此类文件或目录警告:include():打开'./templates_c/73b1662b4c376f493278f9873564df03430a0b43.file.poopy失败.在/ var/www/HRTRL/includes/CallLog/lib/Smarty/libs/sysp中包含tpl.php'(include_path ='.:/ usr/share/php:/ usr/share/pear')第423行的lugins/smarty_internal_template.php
我已经独立测试了我的框架的其余部分,一切似乎都有效.我的"前端控制器"将请求正确地路由到正确的控制器,我似乎能够正常渲染常规HTML.
另外,为了测试,我已经将所有Smarty库文件夹以及其他所需目录chmod到777.我仍然收到相同的权限错误.
编辑
这些是我用于所有必需的智能文件夹的设置.
$smarty->setTemplateDir('lib/smarty/templates');
$smarty->setCompileDir('lib/smarty/templates_c');
$smarty->setCacheDir('lib/smarty/cache');
$smarty->setConfigDir('lib/smarty/configs');
Run Code Online (Sandbox Code Playgroud) 我有代码,由于各种原因,我正在尝试从C运行时移植到使用Windows Heap API的代码.我遇到了一个问题:如果我重定向malloc/ calloc/ realloc/ free调用HeapAlloc/ HeapReAlloc/ HeapFree(使用GetProcessHeap的手柄),内存似乎是正确分配(无不良指针返回,没有抛出异常),但我的图书馆porting因某种原因说"未能分配内存".
我已尝试使用Microsoft CRT(使用下面的Heap API)和另一个公司的运行时库(使用下面的Global Memory API); 两者的malloc适用于库,但由于某些原因,直接使用Heap API不起作用.
我已经检查过分配不是太大(> = 0x7FFF8字节),而它们不是.
我能想到的唯一问题是内存对齐; 那是这样吗?或者除此之外,Heap API和我不知道的CRT内存API有根本区别吗?
如果是这样,它是什么?如果没有,那么为什么静态 Microsoft CRT(包含在Visual Studio中)在调用之前malloc/ calloc之前需要一些额外的步骤HeapAlloc?我怀疑存在差异,但我想不出它可能是什么.
谢谢!
我想让我的用户能够将表导出为CSV.
所以在我的控制器中,我已添加到文件的顶部:
respond_to :html, :js, :csv
Run Code Online (Sandbox Code Playgroud)
如果请求的格式是csv,我也设置标题:
if params[:format] == 'csv'
generate_csv_headers("negotiations-#{Time.now.strftime("%Y%m%d")}")
end
Run Code Online (Sandbox Code Playgroud)
generate_csv_headers(在application_controller中)的代码是:
def generate_csv_headers(filename)
headers.merge!({
'Cache-Control' => 'must-revalidate, post-check=0, pre-check=0',
'Content-Type' => 'text/csv',
'Content-Disposition' => "attachment; filename=\"#{filename}\"",
'Content-Transfer-Encoding' => 'binary'
})
end
Run Code Online (Sandbox Code Playgroud)
我还创建了一个名为index.csv.erb生成我的文件的视图:
<%- headers = ["Id", "Name"] -%>
<%= CSV.generate_line headers %>
<%- @negotiations.each do |n| -%>
<%- row = [ n.id,
n.name ] -%>
<%= CSV.generate_line row %>
<%- end -%>
Run Code Online (Sandbox Code Playgroud)
我没有任何错误,但它只是显示CSV文件的内容,而我希望浏览器提示下载文件.
我已经阅读了很多,但找不到任何有用的东西.你有好主意吗?
谢谢,p.
我想在某个日期以DATE值存储我的数据库中的项目.我不知道如何从本周获得当前的周一,周二等.这是我当前的数据库设置.
menuentry
id int(10) PK
menu_item_id int(10) FK
day_of_week date
message varchar(255)
Run Code Online (Sandbox Code Playgroud)
所以我有一个类设置,包含所有信息然后我会做这样的事情......
foreach ( $menuEntryArray as $item )
{
if ( $item->getDate() == [DONT KNOW WHAT TO PUT HERE] )
{
// code to display menu_item information
}
}
Run Code Online (Sandbox Code Playgroud)
所以我只是不确定该怎么把"[不知道该怎么放在这里]"进行比较,看看是否为本周的周一或周二指定了日期等.上面的foreach运行一周中的每一天 - 所以它看起来像这样......
Monday
Item 1
Item 2
Item 3
Tuesday
Item 1
Wednesday
Item 1
Item 2
...
Run Code Online (Sandbox Code Playgroud)
谢谢!