Paste: segfault

Author: slava
Mode: factor
Date: Thu, 22 Jan 2009 00:30:17
Plain Text |
I have a problem where passing certain CFAttributedStrings to
CTLineCreateWithAttributedString triggers a segmentation fault. Here
is a test case:

------------
#include <Carbon/Carbon.h>
#include <CoreFoundation/CoreFoundation.h>

static char string[] = { 230, 151, 165, 230, 156, 172, 232, 170, 158, 0 };

void test_me(int passADictionary)
{
 CFStringRef str =
CFStringCreateWithCString(NULL,string,kCFStringEncodingUTF8);
 if(!str) { printf("str == NULL\n"); exit(1); }

 CFDictionaryRef dict = CFDictionaryCreate(NULL,NULL,NULL,0,NULL,NULL);
 if(!dict) { printf("dict == NULL\n"); exit(1); }

 CFAttributedStringRef astr =
CFAttributedStringCreate(NULL,str,(passADictionary == 1 ? dict :
NULL));
 if(!astr) { printf("astr == NULL\n"); exit(1); }

 CTLineRef line = CTLineCreateWithAttributedString(astr);
 if(!line) { printf("line == NULL\n"); exit(1); }
}

int main()
{
 printf("Calling test_me(0)...\n");
 test_me(0);
 printf("OK!\n");

 printf("Calling test_me(1)...\n");
 test_me(1);
 printf("OK!\n");
}
-----------

If test_me is called with passADictionary=0, then the dictionary
passed to CFAttributedStringCreate() is NULL, and everything works.
However, if test_me is called with passADictionary=1, I pass in an
empty immutable dictionary created with CFDictionaryCreate, and
CTLineCreateWithAttributedString segfaults.

Furthermore, notice how the string is the UTF8 encoded Japanese text
"日本語". if I change the string at the top of the file to only contain
ASCII characters, then both test_me(0) and test_me(1) succeed.

So, can someone tell me what I'm doing wrong? I'd like to be able to
pass non-NULL dictionaries to CFAttributedStringCreate(), since in
particular I'm interested in setting kCTFontAttributeName to a CTFont.

New Annotation

Summary:
Author:
Mode:
Body: