我决定在一些旧代码上运行一个静态分析工具,我找到了一些我正在使用sprintf的地方.该工具建议使用vsnprintf或snprintf替换调用,因为sprintf不会对缓冲区溢出执行任何类型的边界检查.
我可以轻松地在调用上进行查找和替换,以便它使用snprintf或vsnprintf,但我想确保没有其他任何事情需要完成才能使功能安全
在某些情况下,使用的字符串源自用户输入,在某些情况下,它们不会.
有人对如何做到这一点有任何建议吗?
此代码段的预期行为是什么?
char * aNullPointer = 0;
snprintf (res, 128, "Testing %s null pointer",aNullPointer);
Run Code Online (Sandbox Code Playgroud)
请注意,我故意试图让它取消引用我的空指针aNullPointer.
行为1)res指向字符串"Testing(null)null指针"
行为2)Seg Fault
根据我的平台,我似乎得到了不同的行为.某些snprintf实现执行完整性检查,而其他实现则不执行.
什么是最常见的行为?
我总是问自己这个问题,为什么在C中的printf()被设计为接受任意数量的参数,是不是表示重载?如果是,纯结构化语言如何包含面向对象的语言概念,如方法重载?
这是我的C代码,用gcc编译.
#include<stdio.h>
int main()
{
int a=1;
switch(a)
{
int x=10;
case 1:
printf("%d\n",printf("%d\b",x));
break;
default:
printf("%d\n",printf("%d\b",x));
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
printf()应该返回它成功打印的元素数.
printf("%d\b", x)应该自己打印10(因为\ b将打印指针后退一步(10中的数字0)并且之后没有任何内容可以打印.所以它应该只打印10.这是2个字符.现在外部printf会显示2.输出应该是102.我实际看到的输出是2.
如果嵌套printfs是记住打印指针的位置?我的意思是,如果\b内部有一个printf,它将使打印指针落后一步.当控制现在进入外部时printf,记住改变的位置了吗?它会覆盖最后一个角色吗?
所以我在这里有这个代码,(现在)只需将base1号码转换为基数为10的数字
/**
* This function is supposed to convert 'number' from base1 to a number in base2.
* It isn't fully implemented yet, and I've only converted base1 to a base 10 number.
*/
void base1_base2(int base1, int base2, int number) {
int num, place = 0;
int rem = number;
int i;
for (i = 0; i < num_digits(number); i++) {
int mod = rem % 10;
rem = floor(rem / 10);
int powerResult = pow(base1, place++);
num = …Run Code Online (Sandbox Code Playgroud) 出于某种原因,我采用printf($var)了过度使用echo $var.我真的不知道为什么.
但是,似乎我有一个问题从变量输出一个字符串 - 如果我printf($var)改为echo $var- 90%的时间它修复了问题.
这种情况发生在我身上不止一次出现不同的错误,从过少的参数到只回显空/空字符串.
任何人都可以解释为什么printf()似乎工作效率低于echo?
我正在使用POSIX线程,在我的程序结束时,我正在等待加入每个线程.经过一段时间的完美运行后,我的代码在等待线程时开始返回一个奇怪的错误.
pthreads threads[C+P];
for(i = 0; i < (C+P); i++)
{
printf("%d\n", i);
pthread_join(threads[i]);
}
Run Code Online (Sandbox Code Playgroud)
如果我删除了printf语句,或者将其替换为任何其他printf语句,延迟或对i的任何其他操作,我仍然会遇到段错误.
我该如何开始调试呢?
似乎printf在cuda代码的内核中不起作用
#include "Common.h"
#include<cuda.h>
#include <stdio.h>
__device__ __global__ void Kernel(float *a_d , float *b_d ,int size)
{
int idx = threadIdx.x ;
int idy = threadIdx.y ;
//Allocating memory in the share memory of the device
__shared__ float temp[16][16];
//Copying the data to the shared memory
temp[idy][idx] = a_d[(idy * (size+1)) + idx] ;
printf("idx=%d, idy=%d, size=%d\n", idx, idy, size);
for(int i =1 ; i<size ;i++) {
if((idy + i) < size) { // NO Thread divergence here …Run Code Online (Sandbox Code Playgroud) 我正在尝试修复我写的脚本:
import java.util.Scanner;
public class Line2
{
public static void main (String [] args)
{
Scanner scan = new Scanner (System.in);
System.out.println ("Please enter 4 integers");
int x1 = scan.nextInt();
int y1 = scan.nextInt();
int x2 = scan.nextInt ();
int y2 = scan.nextInt ();
double distance;
//Asking the user to insert coordinates of both points and setting double
// on distance in order to properly calculate the square root
distance = Math.sqrt((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1));
System.out.print( "the length of the line …Run Code Online (Sandbox Code Playgroud) 我正在写一个代理服务器,我遇到了一个奇怪的错误,我希望有人能够解释.
我收到了来自客户的GET请求的第一行.例如,客户端将发送请求:
GET http://en.wikipedia.org/wiki/Special:Random HTTP/1.0
Host: en.wikipedia.org
...
Run Code Online (Sandbox Code Playgroud)
我会将此请求转发给服务器.
但是,对于某些网址,我会遇到一个问题:
GET http://map.media6degrees.com/orbserv/curl=http%3A%2F%2Fwww.masteringemacs.org%2Farticles[trunc] HTTP/1.0
Run Code Online (Sandbox Code Playgroud)
我把这条线读进去了char buffer[MAXLINE_LENGTH],这条线足以容纳字符串.
当我打印收到的get请求时
printf(buffer);
Run Code Online (Sandbox Code Playgroud)
打印的字符串是:
GET http://map.media6degrees.com/orbserv/hbpix?pixId=2869&curl=http0X0.0000000000015P-10220.0000000.000000www.masteringemacs.org0.000000articles0.00000020100.000000110.000000010.000000running-shells-in-emacs-overview204741995430849962482228271154502456423284733956118041206315879167624419264810411254941012469231829496710329852458403099883653794777355548418601638730167027236864.000000 HTTP/1.0
Run Code Online (Sandbox Code Playgroud)
似乎%3A,%2F等已经过字符串格式化.
当我运行时printf("%s", buffer);,我得到正确和预期的输出
编辑:我理解为什么会这样; 我对为什么会这样发生感兴趣.printf的值是来自堆栈中某个任意区域的"字符串格式"吗?%3A等有效格式字符串吗?