小编Spl*_*aty的帖子

为什么Linux hwmon中允许sprintf可能存在缓冲区溢出?

我已经看到以下代码片段重复用于Linux hwmon设备:

return sprintf(buf, "%d\n", in_input);
Run Code Online (Sandbox Code Playgroud)

哪里buf是烧焦的指针char *buf,并in_input通常是一个intu16.目的是将从设备读回的值复制到为此设备属性创建的sysfs文件.

举个例子,你可以看看Linux/drivers/hwmon/mcp3021.c(或4.9内核以前的任何hwmon设备).您可以看到第81行的函数返回a u16,而第99行的代码将其存储u16char *buf.

 81 static inline u16 volts_from_reg(struct mcp3021_data *data, u16 val)
 82 {
 83         return DIV_ROUND_CLOSEST(data->vdd * val, 1 << data->output_res);
 84 }
 85 
 86 static ssize_t show_in_input(struct device *dev, struct device_attribute *attr,
 87                 char *buf)
 88 {
 89         struct i2c_client *client = to_i2c_client(dev);
 90         struct mcp3021_data *data = i2c_get_clientdata(client);
 91         int reg, in_input; …
Run Code Online (Sandbox Code Playgroud)

c linux linux-device-driver

5
推荐指数
1
解决办法
429
查看次数

我需要帮助来解释这段代码的行为

我一直在使用struct数组的概念遇到很多麻烦.我把一些基本代码放在一起.这段代码的输出不是我预期的.我想知道是否有人可以解释为什么这段代码的行为方式.

#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>

struct DataRow
{
    std::string word1;
    std::string word2;
    std::string word3;  
};

void getRow( std::string line, DataRow** dataRowPointer, int index )
{
    std::stringstream sline(line);
    std::string word;

    int wordIndex = 0;

    *dataRowPointer = new DataRow[3];

    while( sline >> word )
    {
        if ( wordIndex == 0 )
        {   (*dataRowPointer)[index].word1 = word;  }
        else if ( wordIndex == 1 )
        {   (*dataRowPointer)[index].word2 = word;  }
        else 
        {   (*dataRowPointer)[index].word3 = word;  }

        wordIndex++;
    }
}

int …
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
1
解决办法
98
查看次数

将字符串分配给结构元素

当我尝试将字符串值分配给结构的成员时,我的程序崩溃了.我怀疑结构中的成员(字符串类型)从未在内存中正确分配.

这是我的代码供参考:

#include <string>
#include <sstream>

struct DataRow
{
    std::string result;
    float temp;
    struct DataRow* next;
};

int main( )
{
    DataRow* node = (DataRow*)malloc(sizeof(DataRow));    // Allocation of memory for struct here

    int currentLoc = 0;
    std::string dataLine = "HUUI 16:35:58 54.4 25.1 PDJ 1 MEME PPP PS$% sc3 BoomBoom SuperPower P0 123 25.86 0 11.1 1.0 50.0 W [2.0,0.28] 1.15 [5,6,100]";
    std::string dataWord;

    std::stringstream sDataLine( dataLine );

    while ( sDataLine >> dataWord )
    {
        if( currentLoc == 0 ) …
Run Code Online (Sandbox Code Playgroud)

c++

2
推荐指数
2
解决办法
706
查看次数

主动降噪 - 可行性

我正在计划一个关于主动噪声消除的微控制器项目。

这个想法是:

  • peaker_1 生成 100-200 Hz 噪声(恒定频率)。
  • 麦克风记录Speaker_1。
  • 信号被传递到DSP 的微控制器中。
  • 微控制器的输出是输入的 180 度相移。
  • 输出信号进入Speaker_2。
  • 来自Speaker_2 的声音会取消来自Speaker_1 的声音。房间里一片寂静

我的问题是:

  1. 这个想法可行吗?(我在这里看到演示:https://www.youtube.com/watch?v=UyN1TACCbHE
  2. 一旦降噪开始起作用,那么麦克风不会接收不到输入吗?因此,没有信号就等于没有噪声消除?

audio signal-processing noise noise-reduction

2
推荐指数
1
解决办法
261
查看次数

C原子读取修改写入

C中是否有任何函数可以进行原子读 - 修改 - 写?我想在一个原子块中读取一个值,然后设置为0.

对于C++,有std :: atomic :: exchange(),这正是我正在寻找的.C中有相应的东西吗?

这是代码:

void interruptHandler(void) {
    /* Callback attached to 3rd party device driver, indicating hardware fault */
    /* Set global variable bit masked flag to indicate interrupt */
    faultsBitMask |= 0x1;
}

void auditPoll(*faults) {
    *faults = faultsBitMask;
    /* !!! Need to prevent interrupt pre-empt here !!! */
    /* Combine these two lines to a single read-modify-write? */
    faultsBitMask = 0;
}
Run Code Online (Sandbox Code Playgroud)

目标架构是PowerPC.

谢谢您的帮助!

c powerpc atomic

2
推荐指数
1
解决办法
919
查看次数

在构造函数中初始化成员有错误

我是C++的新手所以请耐心等待.

当没有有效值分配给成员时,是否有最佳实践来初始化构造函数中的成员?

例如:

device_123::device_123(data_struct_t * initData)  
{
    if(initData==NULL)
    {
       print_error(0);
       // what to initialize foo/bar to?
    }
    else
    {
      foo = initData->foo;
      bar = initData->bar; 
    }
}
Run Code Online (Sandbox Code Playgroud)

在"initData == NULL"的情况下,是否有一种干净的方式来初始化foo和bar说:"嘿,我们实际上没有得到分配给我们的正确值".

我知道这个问题可能听起来特定于我的代码实现应如何解释foo/bar,但我只是想知道是否有最佳实践.

c++

1
推荐指数
1
解决办法
67
查看次数

HashSet中的并发修改异常

我用这段代码得到了Concurrent Modification Exception错误:

Iterator iterateBids = bidders.iterator();
     Person nextBidder;

bidders.add(bid.getBidder());

if (highestBid == null) {
    // There is no previous bid.
    highestBid = bid;
    while (iterateBids.hasNext()) {
        //nextBidder = (Person) iterateBids.next();
        ((Person) iterateBids.next()).bidUpdate(this, bid);
    }
    return true;
} else if (bid.getValue() > highestBid.getValue()) {
    // The bid is better than the previous one.
    highestBid = bid;
    while (iterateBids.hasNext()) {
        nextBidder = (Person) iterateBids.next();
        nextBidder.bidUpdate(this, bid);
    }
    return true;
}
Run Code Online (Sandbox Code Playgroud)

bidders是一个包含Person的HashSet.错误发生在"nextBidder =(Person)iterateBids.next();" 该代码会查找高于当前出价的出价.如果更高,则迭代设置的投标人并执行bidUpdate()方法.

我如何同时修改和迭代?

java

0
推荐指数
2
解决办法
1159
查看次数