Memory leaks UIWebView中类型为range的输入元素泄漏

Memory leaks UIWebView中类型为range的输入元素泄漏,memory-leaks,uiwebview,webkit,app-store,html-input,Memory Leaks,Uiwebview,Webkit,App Store,Html Input,我正要提交我的应用程序供审查,这时我发现UIWebView中类型为range的输入元素添加到文档中时泄漏了12个字节。没有后续泄漏;即使使用滑块也不行 如能就如何进行我的提交提出任何建议,我将不胜感激。我应该担心12个字节吗?我是否应该找到一种方法来解决这个问题,比如说,完全不使用这个元素?或者,我是否应该向审查人员记录泄漏情况(在审查说明标题下) 可以使用最小的UIWebView应用程序复制泄漏: #import "TjaViewController.h" @interface TjaVie

我正要提交我的应用程序供审查,这时我发现UIWebView中类型为range的输入元素添加到文档中时泄漏了12个字节。没有后续泄漏;即使使用滑块也不行

如能就如何进行我的提交提出任何建议,我将不胜感激。我应该担心12个字节吗?我是否应该找到一种方法来解决这个问题,比如说,完全不使用这个元素?或者,我是否应该向审查人员记录泄漏情况(在审查说明标题下)

可以使用最小的UIWebView应用程序复制泄漏:

#import "TjaViewController.h"

@interface TjaViewController ()
@property (weak, nonatomic) IBOutlet UIWebView *webView;
@end

@implementation TjaViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.webView loadHTMLString:@"<input type='range'>" baseURL:nil];
}

@end
#导入“TjaViewController.h”
@接口TjaViewController()
@属性(弱、非原子)ibuiwebview*webView;
@结束
@TjaViewController的实现
-(无效)viewDidLoad
{
[超级视图下载];
[self.webView loadHTMLString:@“baseURL:nil];
}
@结束
使用仪器分析应用程序会产生具有以下属性的单一泄漏:

类别:Malloc 12字节
保留计数:1
责任库:JavaScriptCore
负责调用方:WTF::fastMalloc(未签名长)

堆栈恍惚:

32 libsystem_pthread.dylib thread_start
31 libsystem_pthread.dylib _pthread_start
30 libsystem_pthread.dylib _pthread_body
29 WebCore RunWebThread(void*)
28 CoreFoundation CFRunLoopRunInMode
27 CoreFoundation CFRunLoopRunSpecific
26 CoreFoundation __CFRunLoopRun
25 CoreFoundation __CFRunLoopDoSources0
24 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
23 WebCore HandleRunSource
22 WebCore ___ZN7WebCoreL26applicationDidBecomeActiveEP22__CFNotificationCenterPvPK10__CFStringPKvPK14__CFDictionary_block_invoke
21 WebCore WebCore::ThreadTimers::sharedTimerFiredInternal()
20 WebCore WebCore::DocumentLoader::handleSubstituteDataLoadNow(WebCore::Timer<WebCore::DocumentLoader>*)
19 WebCore WebCore::DocumentLoader::responseReceived(WebCore::CachedResource*, WebCore::ResourceResponse const&)
18 WebCore WebCore::DocumentLoader::continueAfterContentPolicy(WebCore::PolicyAction)
17 WebCore WebCore::DocumentLoader::dataReceived(WebCore::CachedResource*, char const*, int)
16 WebCore WebCore::DocumentLoader::commitLoad(char const*, int)
15 WebKit WebFrameLoaderClient::committedLoad(WebCore::DocumentLoader*, char const*, int)
14 WebKit -[WebDataSource(WebInternal) _receivedData:]
13 WebKit -[WebHTMLRepresentation receivedData:withDataSource:]
12 WebCore WebCore::DocumentLoader::commitData(char const*, unsigned long)
11 WebCore WebCore::DecodedDataDocumentParser::appendBytes(WebCore::DocumentWriter*, char const*, unsigned long)
10 WebCore WebCore::HTMLDocumentParser::append(WTF::PassRefPtr<WTF::StringImpl>)
9 WebCore WebCore::HTMLDocumentParser::pumpTokenizer(WebCore::HTMLDocumentParser::SynchronousMode)
8 WebCore WebCore::HTMLDocumentParser::constructTreeFromHTMLToken(WebCore::HTMLToken&)
7 WebCore WebCore::HTMLConstructionSite::executeQueuedTasks()
6 WebCore WebCore::executeTask(WebCore::HTMLConstructionSiteTask&)
5 WebCore WebCore::insert(WebCore::HTMLConstructionSiteTask&, bool)
4 WebCore WebCore::HTMLInputElement::attach(WebCore::Node::AttachContext const&)
3 WebCore WebCore::FeatureObserver::didObserve(WebCore::FeatureObserver::Feature)
2 JavaScriptCore WTF::BitVector::resizeOutOfLine(unsigned long)
1 JavaScriptCore WTF::fastMalloc(unsigned long)
0 JavaScriptCore WTF::MallocHook::recordAllocation(void*, unsigned long)
32 libsystem\u pthread.dylib thread\u启动
31 libsystem_pthread.dylib_pthread_start
30 libsystem_pthread.dylib_pthread_body
29 WebCore RunWebThread(无效*)
28 CoreFoundation CFRunLoopRunInMode
27 CoreFoundation CFRunLoopRunSpecific
26核心基金会
25 CoreFoundation\uu CFRunLoopDoSources0
24 CoreFoundation\uuu CFRUNLOOP\u正在调用\u OUT\u以执行\u SOURCE0\u函数__
23 WebCore HandleRunSource
22 WebCore ZN7WebCorel26应用程序IDBECOMEACTIVEEP22\uuuuu CFNotificationCenterPvPK10\uuuu CFStringPKvPK14\uuuu CFDictionary\uu CFBLOCK\uu调用
21 WebCore WebCore::ThreadTimers::sharedTimerFiredInternal()
20 WebCore WebCore::DocumentLoader::HandleSubstitutedCataloadNow(WebCore::Timer*)
19 WebCore WebCore::DocumentLoader::responseReceived(WebCore::CachedResource*,WebCore::ResourceResponse常量&)
18 WebCore WebCore::DocumentLoader::continueAfterContentPolicy(WebCore::PolicyAction)
17 WebCore WebCore::DocumentLoader::dataReceived(WebCore::CachedResource*,char const*,int)
16 WebCore WebCore::DocumentLoader::commitLoad(字符常量*,int)
15 WebKit WebFrameLoaderClient::committedLoad(WebCore::DocumentLoader*,char const*,int)
14 WebKit-[WebDataSource(WebInternal)\u receivedData:]
13 WebKit-[WebHTMLRepresentation接收数据:带数据源:]
12 WebCore WebCore::DocumentLoader::commitData(字符常量*,无符号长)
11 WebCore WebCore::DecodedDataDocumentParser::appendBytes(WebCore::DocumentWriter*,char const*,无符号长)
10 WebCore WebCore::HTMLDocumentParser::append(WTF::PassRefPtr)
9 WebCore WebCore::HTMLDocumentParser::pumpTokenizer(WebCore::HTMLDocumentParser::SynchronousMode)
8 WebCore WebCore::HTMLDocumentParser::constructTreeFromHTMLToken(WebCore::HTMLToken&)
7 WebCore WebCore::HTMLConstructionSite::ExecuteQueueTasks()
6 WebCore WebCore::executeTask(WebCore::HTMLConstructionSiteTask&)
5 WebCore WebCore::insert(WebCore::HTMLConstructionSiteTask&,bool)
4 WebCore WebCore::HTMLInputElement::attach(WebCore::Node::AttachContext常量&)
3 WebCore WebCore::FeatureObserver::didObserve(WebCore::FeatureObserver::Feature)
2 JavaScriptCore WTF::BitVector::resizeOutOfLine(无符号长)
1 JavaScriptCore WTF::fastMalloc(无符号长)
0 JavaScriptCore WTF::MallocHook::recordAllocation(void*,无符号长)

我想我找到了答案

看来这是libWTF的漏洞

这是源代码

void bit vector::resizeOutOfLine(大小\u t numBits)
{
断言(numBits>maxInlineBits());
OutOfLineBits*newOutOfLineBits=OutOfLineBits::create(numBits);
size_t newNumWords=newOutOfLineBits->numWords();
if(isInline()){
//确保所有的位都为零,以防我们进行无操作调整大小。
*newOutOfLineBits->bits()=m_bitsOrPointer&~(static_cast(1)bits()+1,0,(newNumWords-1)*sizeof(void*);
}否则{
如果(numBits>size()){
size_t oldNumWords=outOfLineBits()->numWords();
memcpy(newOutOfLineBits->bits(),outOfLineBits()->bits(),oldNumWords*sizeof(void*);
memset(newOutOfLineBits->bits()+oldNumWords,0,(newNumWords-oldNumWords)*sizeof(void*);
}否则
memcpy(newOutOfLineBits->bits(),outOfLineBits()->bits(),newOutOfLineBits->numWords()*sizeof(void*);
OutOfLineBits::destroy(OutOfLineBits());
}
m_bitsOrPointer=按位转换(newOutOfLineBits)>>1;
}
很明显,当代码变为InLine()时,newOutOfLineBits不会被破坏

我试图替换系统JavascriptCore.framework

/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator7.1.sdk/System/Library/Frameworks/JavaScriptCore.framework

但是失败了,系统框架是从动态库编译的

据我所知,苹果禁止为iOS编译动态库


因此,我认为唯一的办法是向苹果公司报告这次泄漏…

我认为这是webkit Core中的一些错误。我试图使用loadRequest获取一个网页,但得到了相同的泄漏WebCore::FeatureObserver::observe(WebCore::Document*,WebCore::FeatureObserver::Feature)WebCore::FeatureObserver::didObserve(WebCore::FeatureObserver::Feature)WTF::BitVector::resizeOutOfLine(无符号长)WTF::fastMalloc(无符号长)WTF::MallocHook::recordAllocation(void*,无符号长)感谢@buaacss确认泄漏。感谢@buaacss!我提交了错误报告。我们认为,根据WTF::FastMalloc的仪器,我们也有一些泄漏。然而,对我们来说,这是从加载图像。你能告诉我你提交给苹果的bug吗?bug报告17808677“UIWebView中的元素类型范围泄漏”
void BitVector::resizeOutOfLine(size_t numBits)
{
    ASSERT(numBits > maxInlineBits());
    OutOfLineBits* newOutOfLineBits = OutOfLineBits::create(numBits);
    size_t newNumWords = newOutOfLineBits->numWords();
    if (isInline()) {
    // Make sure that all of the bits are zero in case we do a no-op resize.
        *newOutOfLineBits->bits() = m_bitsOrPointer & ~(static_cast<uintptr_t>(1) << maxInlineBits());
        memset(newOutOfLineBits->bits() + 1, 0, (newNumWords - 1) * sizeof(void*));
    } else {
        if (numBits > size()) {
            size_t oldNumWords = outOfLineBits()->numWords();
            memcpy(newOutOfLineBits->bits(), outOfLineBits()->bits(), oldNumWords * sizeof(void*));
            memset(newOutOfLineBits->bits() + oldNumWords, 0, (newNumWords - oldNumWords) * sizeof(void*));
        } else
            memcpy(newOutOfLineBits->bits(), outOfLineBits()->bits(), newOutOfLineBits->numWords() * sizeof(void*));
        OutOfLineBits::destroy(outOfLineBits());
    }
    m_bitsOrPointer = bitwise_cast<uintptr_t>(newOutOfLineBits) >> 1;
}