c - Valgrind - “写入大小为1的无效”

时间:2016-03-08 13:37:52

标签: c gdb valgrind

尽管现在我试图寻找大约两个小时的解决方案,但我完全失去了这一点:

Valgrind正在吐出大量1的无效读取和使用此代码无效写入大小1,我无法弄清楚如何修复它。

char *movieGetDirector(const movie *m)
{
 char *tmp = NULL ;
 tmp = malloc(strlen(m->director)+1) ;
 strcpy(tmp, m->director) ;
 return tmp ;
}

在使用strlen的行上获取大小为1的无效读取,然后在strcpy行上写入无效的写入。我知道m-> director绝对是一个字符串,因为用gdb测试它会发现它是一个字符串而且它有文本。 google上针对此错误的所有解决方案都涉及到没有那个+1,但我有它在那里,它仍然是一个问题。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

你的malloc / strlen / strcpy调用看起来很好。设置 func sendText(stext: NSMutableAttributedString) { dispatch_async(dispatch_get_main_queue()) { let range:NSRange = NSMakeRange(0, stext.length) stext.enumerateAttributesInRange(range, options: NSAttributedStringEnumerationOptions.init(rawValue: 0), usingBlock: { (dic: [String:AnyObject]?, rang:NSRange!, stop: UnsafeMutablePointer<ObjCBool>) -> Void in self.attachement = dic as NSDictionary! self.attachement.enumerateKeysAndObjectsUsingBlock({ (key:AnyObject?, obj:AnyObject?, stop:UnsafeMutablePointer<ObjCBool>) -> Void in let stri = key as! NSString! if stri == "NSAttachment"{ let att:NSTextAttachment = obj as! NSTextAttachment if att.image == nil{ print("no image") }else{ var im:UIImage = att.image! print("image exists") if im.size.height > 340 && im.size.width > 272 { let heightScale: CGFloat = self.textView.frame.size.height / im.size.height let widthScale: CGFloat = self.textView.frame.size.width / im.size.width if heightScale < widthScale { let height = im.size.height * heightScale * 0.7 let width = im.size.width * heightScale * 0.7 UIGraphicsBeginImageContext(CGSizeMake(width, height)) im.drawInRect(CGRectMake(0, 0, width, height)) im = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() } else { let height = im.size.height * widthScale * 0.7 let width = im.size.width * widthScale * 0.7 UIGraphicsBeginImageContext(CGSizeMake(width, height)) im.drawInRect(CGRectMake(0, 0, width, height)) im = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() } } self.lastRange = rang.location self.finalForWatch.append(NSAttributedString(attributedString: stext.attributedSubstringFromRange(NSMakeRange(0, rang.location)))) self.finalForWatch.append(im) } } if self.lastRange == 0 { self.finalForWatch.append(stext) } else { self.finalForWatch.append(NSAttributedString(attributedString: stext.attributedSubstringFromRange(NSMakeRange(1, stext.length-1)))) } }) }) let data: NSData = NSKeyedArchiver.archivedDataWithRootObject(self.finalForWatch) let applicationDict = ["done" : data] let documentDirectoryURL = try! NSFileManager.defaultManager().URLForDirectory(.DocumentDirectory, inDomain: .UserDomainMask, appropriateForURL: nil, create: true) let fileDestinationUrl = documentDirectoryURL.URLByAppendingPathComponent("file.txt") do{ try data.writeToURL(fileDestinationUrl, atomically: true) } catch let error as NSError { print("error writing to url \(fileDestinationUrl)") print(error.localizedDescription) } self.session?.transferFile(fileDestinationUrl, metadata: nil) } } 和m m字段的代码很可能是错误的并且内存已损坏。你应该仔细检查那个变量的分配位置&amp;初始化。

说,你的功能似乎是复制现有的strdup功能。所以你可能想写:

director